@@ -617,33 +617,47 @@ impl<'hir> LoweringContext<'_, 'hir> {
617617
618618 hir:: ExprKind :: Closure ( c)
619619 } ;
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+ } ,
629646 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)
642656 } ;
643657
658+ let generator = hir:: Expr { hir_id, kind : generator_kind, span : self . lower_span ( span) } ;
659+
644660 // `future::from_generator`:
645- let unstable_span =
646- self . mark_span_with_reason ( DesugaringKind :: Async , span, self . allow_gen_future . clone ( ) ) ;
647661 let gen_future = self . expr_lang_item_path (
648662 unstable_span,
649663 hir:: LangItem :: FromGenerator ,
0 commit comments