@@ -227,13 +227,17 @@ impl<'a> TyLoweringContext<'a> {
227227 . intern ( Interner )
228228 }
229229 TypeRef :: Placeholder => TyKind :: Error . intern ( Interner ) ,
230- TypeRef :: Fn ( params, is_varargs ) => {
230+ & TypeRef :: Fn ( ref params, variadic , is_unsafe ) => {
231231 let substs = self . with_shifted_in ( DebruijnIndex :: ONE , |ctx| {
232232 Substitution :: from_iter ( Interner , params. iter ( ) . map ( |( _, tr) | ctx. lower_ty ( tr) ) )
233233 } ) ;
234234 TyKind :: Function ( FnPointer {
235235 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+ } ,
237241 substitution : FnSubst ( substs) ,
238242 } )
239243 . intern ( Interner )
@@ -1573,7 +1577,12 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
15731577 . with_type_param_mode ( ParamLoweringMode :: Variable ) ;
15741578 let ret = ctx_ret. lower_ty ( & data. ret_type ) ;
15751579 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+ ) ;
15771586 make_binders ( db, & generics, sig)
15781587}
15791588
@@ -1617,7 +1626,7 @@ fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnS
16171626 TyLoweringContext :: new ( db, & resolver) . with_type_param_mode ( ParamLoweringMode :: Variable ) ;
16181627 let params = fields. iter ( ) . map ( |( _, field) | ctx. lower_ty ( & field. type_ref ) ) . collect :: < Vec < _ > > ( ) ;
16191628 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 ) )
16211630}
16221631
16231632/// Build the type of a tuple struct constructor.
@@ -1644,7 +1653,7 @@ fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId)
16441653 TyLoweringContext :: new ( db, & resolver) . with_type_param_mode ( ParamLoweringMode :: Variable ) ;
16451654 let params = fields. iter ( ) . map ( |( _, field) | ctx. lower_ty ( & field. type_ref ) ) . collect :: < Vec < _ > > ( ) ;
16461655 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 ) )
16481657}
16491658
16501659/// Build the type of a tuple enum variant constructor.
0 commit comments