@@ -227,13 +227,17 @@ impl<'a> TyLoweringContext<'a> {
227
227
. intern ( Interner )
228
228
}
229
229
TypeRef :: Placeholder => TyKind :: Error . intern ( Interner ) ,
230
- TypeRef :: Fn ( params, is_varargs ) => {
230
+ & TypeRef :: Fn ( ref params, variadic , is_unsafe ) => {
231
231
let substs = self . with_shifted_in ( DebruijnIndex :: ONE , |ctx| {
232
232
Substitution :: from_iter ( Interner , params. iter ( ) . map ( |( _, tr) | ctx. lower_ty ( tr) ) )
233
233
} ) ;
234
234
TyKind :: Function ( FnPointer {
235
235
num_binders : 0 , // FIXME lower `for<'a> fn()` correctly
236
- sig : FnSig { abi : ( ) , safety : Safety :: Safe , variadic : * is_varargs } ,
236
+ sig : FnSig {
237
+ abi : ( ) ,
238
+ safety : if is_unsafe { Safety :: Unsafe } else { Safety :: Safe } ,
239
+ variadic,
240
+ } ,
237
241
substitution : FnSubst ( substs) ,
238
242
} )
239
243
. intern ( Interner )
@@ -1573,7 +1577,12 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
1573
1577
. with_type_param_mode ( ParamLoweringMode :: Variable ) ;
1574
1578
let ret = ctx_ret. lower_ty ( & data. ret_type ) ;
1575
1579
let generics = generics ( db. upcast ( ) , def. into ( ) ) ;
1576
- let sig = CallableSig :: from_params_and_return ( params, ret, data. is_varargs ( ) ) ;
1580
+ let sig = CallableSig :: from_params_and_return (
1581
+ params,
1582
+ ret,
1583
+ data. is_varargs ( ) ,
1584
+ if data. has_unsafe_kw ( ) { Safety :: Unsafe } else { Safety :: Safe } ,
1585
+ ) ;
1577
1586
make_binders ( db, & generics, sig)
1578
1587
}
1579
1588
@@ -1617,7 +1626,7 @@ fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnS
1617
1626
TyLoweringContext :: new ( db, & resolver) . with_type_param_mode ( ParamLoweringMode :: Variable ) ;
1618
1627
let params = fields. iter ( ) . map ( |( _, field) | ctx. lower_ty ( & field. type_ref ) ) . collect :: < Vec < _ > > ( ) ;
1619
1628
let ( ret, binders) = type_for_adt ( db, def. into ( ) ) . into_value_and_skipped_binders ( ) ;
1620
- Binders :: new ( binders, CallableSig :: from_params_and_return ( params, ret, false ) )
1629
+ Binders :: new ( binders, CallableSig :: from_params_and_return ( params, ret, false , Safety :: Safe ) )
1621
1630
}
1622
1631
1623
1632
/// Build the type of a tuple struct constructor.
@@ -1644,7 +1653,7 @@ fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId)
1644
1653
TyLoweringContext :: new ( db, & resolver) . with_type_param_mode ( ParamLoweringMode :: Variable ) ;
1645
1654
let params = fields. iter ( ) . map ( |( _, field) | ctx. lower_ty ( & field. type_ref ) ) . collect :: < Vec < _ > > ( ) ;
1646
1655
let ( ret, binders) = type_for_adt ( db, def. parent . into ( ) ) . into_value_and_skipped_binders ( ) ;
1647
- Binders :: new ( binders, CallableSig :: from_params_and_return ( params, ret, false ) )
1656
+ Binders :: new ( binders, CallableSig :: from_params_and_return ( params, ret, false , Safety :: Safe ) )
1648
1657
}
1649
1658
1650
1659
/// Build the type of a tuple enum variant constructor.
0 commit comments