rZhBoYao added a comment. Consider:
struct T { const int *begin() const; const int *end() const; T &r() [[clang::lifetimebound]]; T t(); }; const T &f1(const T &t [[clang::lifetimebound]]) { return t; } T g(); void foo() { for (auto e : f1(g())) {} for (auto e : g().t().t().r()) {} } The first __range1: | | `-VarDecl 0x11e901358 <col:17, col:23> col:17 implicit used __range1 'const T &' cinit | | `-ExprWithCleanups 0x11e9015b8 <col:17, col:23> 'const T':'const T' lvalue | | `-CallExpr 0x11e9010b0 <col:17, col:23> 'const T':'const T' lvalue | | |-ImplicitCastExpr 0x11e901098 <col:17> 'const T &(*)(const T &)' <FunctionToPointerDecay> | | | `-DeclRefExpr 0x11e901018 <col:17> 'const T &(const T &)' lvalue Function 0x11e900a48 'f1' 'const T &(const T &)' | | `-MaterializeTemporaryExpr 0x11e9010f0 <col:20, col:22> 'const T':'const T' lvalue extended by Var 0x11e901358 '__range1' 'const T &' | | `-ImplicitCastExpr 0x11e9010d8 <col:20, col:22> 'const T':'const T' <NoOp> | | `-CallExpr 0x11e900ec0 <col:20, col:22> 'T':'T' | | `-ImplicitCastExpr 0x11e900ea8 <col:20> 'T (*)()' <FunctionToPointerDecay> | | `-DeclRefExpr 0x11e900e30 <col:20> 'T ()' lvalue Function 0x11e900bd0 'g' 'T ()' g() is extended by __range1. The second __range1: | `-VarDecl 0x11e9040a0 <col:17, col:31> col:17 implicit used __range1 'T &' cinit | `-ExprWithCleanups 0x11e904338 <col:17, col:31> 'T':'T' lvalue | `-CXXMemberCallExpr 0x11e903f68 <col:17, col:31> 'T':'T' lvalue | `-MemberExpr 0x11e903f38 <col:17, col:29> '<bound member function type>' .r 0x11e900638 | `-MaterializeTemporaryExpr 0x11e903f20 <col:17, col:27> 'T':'T' xvalue extended by Var 0x11e9040a0 '__range1' 'T &' | `-CXXMemberCallExpr 0x11e903f00 <col:17, col:27> 'T':'T' | `-MemberExpr 0x11e903ed0 <col:17, col:25> '<bound member function type>' .t 0x11e900780 | `-MaterializeTemporaryExpr 0x11e903eb8 <col:17, col:23> 'T':'T' xvalue extended by Var 0x11e9040a0 '__range1' 'T &' | `-CXXMemberCallExpr 0x11e903e68 <col:17, col:23> 'T':'T' | `-MemberExpr 0x11e903e38 <col:17, col:21> '<bound member function type>' .t 0x11e900780 | `-MaterializeTemporaryExpr 0x11e903e20 <col:17, col:19> 'T':'T' xvalue extended by Var 0x11e9040a0 '__range1' 'T &' | `-CallExpr 0x11e903e00 <col:17, col:19> 'T':'T' | `-ImplicitCastExpr 0x11e903de8 <col:17> 'T (*)()' <FunctionToPointerDecay> | `-DeclRefExpr 0x11e903dc8 <col:17> 'T ()' lvalue Function 0x11e900bd0 'g' 'T ()' g() and 2 t()'s are extended by __range1. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D139586/new/ https://reviews.llvm.org/D139586 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits