@@ -617,33 +617,47 @@ impl<'hir> LoweringContext<'_, 'hir> {
617
617
618
618
hir:: ExprKind :: Closure ( c)
619
619
} ;
620
- let generator_hir_id = self . lower_node_id ( closure_node_id) ;
621
- // FIXME: only add track caller if the parent is track_caller
622
- self . lower_attrs (
623
- generator_hir_id,
624
- & [ Attribute {
625
- kind : AttrKind :: Normal ( ptr:: P ( NormalAttr {
626
- item : AttrItem {
627
- path : Path :: from_ident ( Ident :: new ( sym:: track_caller, span) ) ,
628
- args : MacArgs :: Empty ,
620
+ let mut parent_has_track_caller = false ;
621
+ for attrs in self . attrs . values ( ) {
622
+ for attr in attrs. into_iter ( ) {
623
+ if attr. has_name ( sym:: track_caller) {
624
+ parent_has_track_caller = true ;
625
+ break ;
626
+ }
627
+ }
628
+ if parent_has_track_caller {
629
+ break ;
630
+ }
631
+ }
632
+ let unstable_span =
633
+ self . mark_span_with_reason ( DesugaringKind :: Async , span, self . allow_gen_future . clone ( ) ) ;
634
+
635
+ let hir_id = if parent_has_track_caller {
636
+ let generator_hir_id = self . lower_node_id ( closure_node_id) ;
637
+ self . lower_attrs (
638
+ generator_hir_id,
639
+ & [ Attribute {
640
+ kind : AttrKind :: Normal ( ptr:: P ( NormalAttr {
641
+ item : AttrItem {
642
+ path : Path :: from_ident ( Ident :: new ( sym:: track_caller, span) ) ,
643
+ args : MacArgs :: Empty ,
644
+ tokens : None ,
645
+ } ,
629
646
tokens : None ,
630
- } ,
631
- tokens : None ,
632
- } ) ) ,
633
- id : self . tcx . sess . parse_sess . attr_id_generator . mk_attr_id ( ) ,
634
- style : AttrStyle :: Outer ,
635
- span,
636
- } ] ,
637
- ) ;
638
- let generator = hir:: Expr {
639
- hir_id : generator_hir_id,
640
- kind : generator_kind,
641
- span : self . lower_span ( span) ,
647
+ } ) ) ,
648
+ id : self . tcx . sess . parse_sess . attr_id_generator . mk_attr_id ( ) ,
649
+ style : AttrStyle :: Outer ,
650
+ span : unstable_span,
651
+ } ] ,
652
+ ) ;
653
+ generator_hir_id
654
+ } else {
655
+ self . lower_node_id ( closure_node_id)
642
656
} ;
643
657
658
+ let generator = hir:: Expr { hir_id, kind : generator_kind, span : self . lower_span ( span) } ;
659
+
644
660
// `future::from_generator`:
645
- let unstable_span =
646
- self . mark_span_with_reason ( DesugaringKind :: Async , span, self . allow_gen_future . clone ( ) ) ;
647
661
let gen_future = self . expr_lang_item_path (
648
662
unstable_span,
649
663
hir:: LangItem :: FromGenerator ,
0 commit comments