@@ -632,24 +632,32 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
632
632
let hir_id = self . tcx . hir ( ) . local_def_id_to_hir_id ( def_id) ;
633
633
// Ensure that the parent of the def is an item, not HRTB
634
634
let parent_id = self . tcx . hir ( ) . get_parent_node ( hir_id) ;
635
- let parent_item_id =
636
- hir:: ItemId { def_id : parent_id. expect_owner ( ) } ;
637
- let parent_impl_id =
638
- hir:: ImplItemId { def_id : parent_id. expect_owner ( ) } ;
639
- let parent_trait_id =
640
- hir:: TraitItemId { def_id : parent_id. expect_owner ( ) } ;
641
- let krate = self . tcx . hir ( ) . krate ( ) ;
642
-
643
- if !( krate. items . contains_key ( & parent_item_id)
644
- || krate. impl_items . contains_key ( & parent_impl_id)
645
- || krate. trait_items . contains_key ( & parent_trait_id) )
635
+ let parent_is_item = if let Some ( parent_def_id) =
636
+ parent_id. as_owner ( )
646
637
{
638
+ let parent_item_id = hir:: ItemId { def_id : parent_def_id } ;
639
+ let parent_impl_id = hir:: ImplItemId { def_id : parent_def_id } ;
640
+ let parent_trait_id =
641
+ hir:: TraitItemId { def_id : parent_def_id } ;
642
+ let parent_foreign_id =
643
+ hir:: ForeignItemId { def_id : parent_def_id } ;
644
+ let krate = self . tcx . hir ( ) . krate ( ) ;
645
+
646
+ krate. items . contains_key ( & parent_item_id)
647
+ || krate. impl_items . contains_key ( & parent_impl_id)
648
+ || krate. trait_items . contains_key ( & parent_trait_id)
649
+ || krate. foreign_items . contains_key ( & parent_foreign_id)
650
+ } else {
651
+ false
652
+ } ;
653
+
654
+ if !parent_is_item {
647
655
struct_span_err ! (
648
656
self . tcx. sess,
649
657
lifetime. span,
650
658
E0657 ,
651
659
"`impl Trait` can only capture lifetimes \
652
- bound at the fn or impl level"
660
+ bound at the fn or impl level"
653
661
)
654
662
. emit ( ) ;
655
663
self . uninsert_lifetime_on_error ( lifetime, def. unwrap ( ) ) ;
0 commit comments