@@ -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,33 @@ 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 > (
344+ tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
345+ item_id : ast:: NodeId ,
346+ ty_span : Span ,
347+ allow_foreign_ty : bool ,
348+ ) {
344349 debug ! ( "check_item_type: {:?}" , item_id) ;
345350
346351 for_id ( tcx, item_id, ty_span) . with_fcx ( |fcx, _this| {
347352 let ty = fcx. tcx . type_of ( fcx. tcx . hir . local_def_id ( item_id) ) ;
348353 let item_ty = fcx. normalize_associated_types_in ( ty_span, & ty) ;
349354
355+ let mut forbid_unsized = true ;
356+ if allow_foreign_ty {
357+ if let TyKind :: Foreign ( _) = tcx. struct_tail ( item_ty) . sty {
358+ forbid_unsized = false ;
359+ }
360+ }
361+
350362 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- ) ;
363+ if forbid_unsized {
364+ fcx. register_bound (
365+ item_ty,
366+ fcx. tcx . require_lang_item ( lang_items:: SizedTraitLangItem ) ,
367+ traits:: ObligationCause :: new ( ty_span, fcx. body_id , traits:: MiscObligation ) ,
368+ ) ;
369+ }
360370
361371 vec ! [ ] // no implied bounds in a const etc
362372 } ) ;
0 commit comments