@@ -13,7 +13,7 @@ use constrained_type_params::{identify_constrained_type_params, Parameter};
1313
1414use hir:: def_id:: DefId ;
1515use rustc:: traits:: { self , ObligationCauseCode } ;
16- use rustc:: ty:: { self , Lift , Ty , TyCtxt , GenericParamDefKind , TypeFoldable } ;
16+ use rustc:: ty:: { self , Lift , Ty , TyCtxt , TyKind , GenericParamDefKind , TypeFoldable } ;
1717use rustc:: ty:: subst:: { Subst , Substs } ;
1818use rustc:: ty:: util:: ExplicitSelf ;
1919use rustc:: util:: nodemap:: { FxHashSet , FxHashMap } ;
@@ -119,14 +119,14 @@ pub fn check_item_well_formed<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: Def
119119 check_item_fn ( tcx, item) ;
120120 }
121121 hir:: ItemKind :: Static ( ref ty, ..) => {
122- check_item_type ( tcx, item. id , ty. span ) ;
122+ check_item_type ( tcx, item. id , ty. span , false ) ;
123123 }
124124 hir:: ItemKind :: Const ( ref ty, ..) => {
125- check_item_type ( tcx, item. id , ty. span ) ;
125+ check_item_type ( tcx, item. id , ty. span , false ) ;
126126 }
127127 hir:: ItemKind :: ForeignMod ( ref module) => for it in module. items . iter ( ) {
128128 if let hir:: ForeignItemKind :: Static ( ref ty, ..) = it. node {
129- check_item_type ( tcx, it. id , ty. span ) ;
129+ check_item_type ( tcx, it. id , ty. span , true ) ;
130130 }
131131 } ,
132132 hir:: ItemKind :: Struct ( ref struct_def, ref ast_generics) => {
@@ -340,23 +340,35 @@ fn check_item_fn<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, item: &hir::Item) {
340340 } )
341341}
342342
343- fn check_item_type < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > , item_id : ast:: NodeId , ty_span : Span ) {
343+ fn check_item_type < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
344+ item_id : ast:: NodeId ,
345+ ty_span : Span ,
346+ allow_foreign_ty : bool ) {
344347 debug ! ( "check_item_type: {:?}" , item_id) ;
345348
346349 for_id ( tcx, item_id, ty_span) . with_fcx ( |fcx, _this| {
347350 let ty = fcx. tcx . type_of ( fcx. tcx . hir . local_def_id ( item_id) ) ;
348351 let item_ty = fcx. normalize_associated_types_in ( ty_span, & ty) ;
349352
350- fcx. register_wf_obligation ( item_ty, ty_span, ObligationCauseCode :: MiscObligation ) ;
351- fcx. register_bound (
352- item_ty,
353- fcx. tcx . require_lang_item ( lang_items:: SizedTraitLangItem ) ,
354- traits:: ObligationCause :: new (
355- ty_span,
356- fcx. body_id ,
357- traits:: MiscObligation ,
358- ) ,
359- ) ;
353+ let mut allow_unsized = false ;
354+ if allow_foreign_ty {
355+ if let TyKind :: Foreign ( _) = tcx. struct_tail ( item_ty) . sty {
356+ allow_unsized = true ;
357+ }
358+ }
359+
360+ if !allow_unsized {
361+ fcx. register_wf_obligation ( item_ty, ty_span, ObligationCauseCode :: MiscObligation ) ;
362+ fcx. register_bound (
363+ item_ty,
364+ fcx. tcx . require_lang_item ( lang_items:: SizedTraitLangItem ) ,
365+ traits:: ObligationCause :: new (
366+ ty_span,
367+ fcx. body_id ,
368+ traits:: MiscObligation ,
369+ ) ,
370+ ) ;
371+ }
360372
361373 vec ! [ ] // no implied bounds in a const etc
362374 } ) ;
0 commit comments