1 // RUN: %clang_cc1 -std=c++23 -triple x86_64-linux-gnu -fcxx-exceptions -ast-dump %s \ 2 // RUN: | FileCheck -strict-whitespace %s 3 4 namespace P2718R0 { 5 6 // Test basic 7 struct A { 8 int a[3] = {1, 2, 3}; 9 A() {} 10 ~A() {} 11 const int *begin() const { return a; } 12 const int *end() const { return a + 3; } 13 A& r() { return *this; } 14 A g() { return A(); } 15 }; 16 17 A g() { return A(); } 18 const A &f1(const A &t) { return t; } 19 20 void test1() { 21 [[maybe_unused]] int sum = 0; 22 // CHECK: FunctionDecl {{.*}} test1 'void ()' 23 // CHECK: | `-CXXForRangeStmt {{.*}} 24 // CHECK-NEXT: | |-<<<NULL>>> 25 // CHECK-NEXT: | |-DeclStmt {{.*}} 26 // CHECK-NEXT: | | `-VarDecl {{.*}} implicit used __range1 'const A &' cinit 27 // CHECK-NEXT: | | `-ExprWithCleanups {{.*}} 'const A':'const P2718R0::A' lvalue 28 // CHECK-NEXT: | | `-CallExpr {{.*}} 'const A':'const P2718R0::A' lvalue 29 // CHECK-NEXT: | | |-ImplicitCastExpr {{.*}} 'const A &(*)(const A &)' <FunctionToPointerDecay> 30 // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'const A &(const A &)' lvalue Function {{.*}} 'f1' 'const A &(const A &)' 31 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'const A':'const P2718R0::A' lvalue extended by Var {{.*}} '__range1' 'const A &' 32 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' <NoOp> 33 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 34 // CHECK-NEXT: | | `-CallExpr {{.*}} 'A':'P2718R0::A' 35 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'A (*)()' <FunctionToPointerDecay> 36 // CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'A ()' lvalue Function {{.*}} 'g' 'A ()' 37 for (auto e : f1(g())) 38 sum += e; 39 } 40 41 struct B : A {}; 42 int (&f(const A *))[3]; 43 const A *g(const A &); 44 void bar(int) {} 45 46 void test2() { 47 // CHECK: FunctionDecl {{.*}} test2 'void ()' 48 // CHECK: | `-CXXForRangeStmt {{.*}} 49 // CHECK-NEXT: | |-<<<NULL>>> 50 // CHECK-NEXT: | |-DeclStmt {{.*}} 51 // CHECK-NEXT: | | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 52 // CHECK-NEXT: | | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 53 // CHECK-NEXT: | | `-CallExpr {{.*}} 'int[3]' lvalue 54 // CHECK-NEXT: | | |-ImplicitCastExpr {{.*}} 'int (&(*)(const A *))[3]' <FunctionToPointerDecay> 55 // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'int (&(const A *))[3]' lvalue Function {{.*}} 'f' 'int (&(const A *))[3]' 56 // CHECK-NEXT: | | `-CallExpr {{.*}} 'const A *' 57 // CHECK-NEXT: | | |-ImplicitCastExpr {{.*}} 'const A *(*)(const A &)' <FunctionToPointerDecay> 58 // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'const A *(const A &)' lvalue Function {{.*}} 'g' 'const A *(const A &)' 59 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' lvalue <DerivedToBase (A)> 60 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'const B':'const P2718R0::B' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 61 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const B':'const P2718R0::B' <NoOp> 62 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'B':'P2718R0::B' (CXXTemporary {{.*}}) 63 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'B':'P2718R0::B' 'void () noexcept(false)' zeroing 64 for (auto e : f(g(B()))) 65 bar(e); 66 } 67 68 // Test discard statement. 69 struct LockGuard { 70 LockGuard() {} 71 ~LockGuard() {} 72 }; 73 74 void test3() { 75 int v[] = {42, 17, 13}; 76 77 // CHECK: FunctionDecl {{.*}} test3 'void ()' 78 // CHECK: -CXXForRangeStmt {{.*}} 79 // CHECK-NEXT: |-<<<NULL>>> 80 // CHECK-NEXT: |-DeclStmt {{.*}} 81 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 82 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 83 // CHECK-NEXT: | `-BinaryOperator {{.*}} 'int[3]' lvalue ',' 84 // CHECK-NEXT: | |-CXXStaticCastExpr {{.*}} 'void' static_cast<void> <ToVoid> 85 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' xvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 86 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' (CXXTemporary {{.*}}) 87 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' 'void ()' 88 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'int[3]' lvalue Var {{.*}} 'v' 'int[3]' 89 for ([[maybe_unused]] int x : static_cast<void>(LockGuard()), v) 90 LockGuard guard; 91 92 // CHECK: -CXXForRangeStmt {{.*}} 93 // CHECK-NEXT: |-<<<NULL>>> 94 // CHECK-NEXT: |-DeclStmt {{.*}} 95 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 96 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 97 // CHECK-NEXT: | `-BinaryOperator {{.*}} 'int[3]' lvalue ',' 98 // CHECK-NEXT: | |-CStyleCastExpr {{.*}} 'void' <ToVoid> 99 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' xvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 100 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' (CXXTemporary {{.*}}) 101 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' 'void ()' 102 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'int[3]' lvalue Var {{.*}} 'v' 'int[3]' 103 for ([[maybe_unused]] int x : (void)LockGuard(), v) 104 LockGuard guard; 105 106 // CHECK: -CXXForRangeStmt {{.*}} 107 // CHECK-NEXT: |-<<<NULL>>> 108 // CHECK-NEXT: |-DeclStmt {{.*}} 109 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 110 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 111 // CHECK-NEXT: | `-BinaryOperator {{.*}} 'int[3]' lvalue ',' 112 // CHECK-NEXT: | |-MaterializeTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' xvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 113 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' (CXXTemporary {{.*}}) 114 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' 'void ()' 115 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'int[3]' lvalue Var {{.*}} 'v' 'int[3]' 116 for ([[maybe_unused]] int x : LockGuard(), v) 117 LockGuard guard; 118 } 119 120 // Test default arg 121 int (&default_arg_fn(const A & = A()))[3]; 122 void test4() { 123 124 // CHECK: FunctionDecl {{.*}} test4 'void ()' 125 // CHECK: -CXXForRangeStmt {{.*}} 126 // CHECK-NEXT: |-<<<NULL>>> 127 // CHECK-NEXT: |-DeclStmt {{.*}} 128 // CHECK-NEXT: | `-VarDecl{{.*}} implicit used __range1 'int (&)[3]' cinit 129 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 130 // CHECK-NEXT: | `-CallExpr {{.*}} 'int[3]' lvalue 131 // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} 'int (&(*)(const A &))[3]' <FunctionToPointerDecay> 132 // CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'int (&(const A &))[3]' lvalue Function {{.*}} 'default_arg_fn' 'int (&(const A &))[3]' 133 // CHECK-NEXT: | `-CXXDefaultArgExpr {{.*}} <<invalid sloc>> 'const A':'const P2718R0::A' lvalue has rewritten init 134 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const A':'const P2718R0::A' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 135 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' <NoOp> 136 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 137 // CHECK-NEXT: | `-CXXTemporaryObjectExpr {{.*}} 'A':'P2718R0::A' 'void ()' 138 for (auto e : default_arg_fn()) 139 bar(e); 140 } 141 142 struct DefaultA { 143 DefaultA() {} 144 ~DefaultA() {} 145 }; 146 147 A foo(const A&, const DefaultA &Default = DefaultA()) { 148 return A(); 149 } 150 151 void test5() { 152 // CHECK: FunctionDecl {{.*}} test5 'void ()' 153 // CHECK: -CXXForRangeStmt {{.*}} 154 // CHECK-NEXT: |-<<<NULL>>> 155 // CHECK-NEXT: |-DeclStmt {{.*}} 156 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 157 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 158 // CHECK-NEXT: | `-CallExpr {{.*}} 'int[3]' lvalue 159 // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} 'int (&(*)(const A &))[3]' <FunctionToPointerDecay> 160 // CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'int (&(const A &))[3]' lvalue Function {{.*}} 'default_arg_fn' 'int (&(const A &))[3]' 161 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const A':'const P2718R0::A' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 162 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' <NoOp> 163 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' 164 // CHECK-NEXT: | `-CallExpr {{.*}} 'A':'P2718R0::A' 165 // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} 'A (*)(const A &, const DefaultA &)' <FunctionToPointerDecay> 166 // CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'A (const A &, const DefaultA &)' lvalue Function {{.*}} 'foo' 'A (const A &, const DefaultA &)' 167 // CHECK-NEXT: | |-MaterializeTemporaryExpr {{.*}} 'const A':'const P2718R0::A' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 168 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' <NoOp> 169 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' 170 // CHECK-NEXT: | | `-CallExpr {{.*}} 'A':'P2718R0::A' 171 // CHECK-NEXT: | | |-ImplicitCastExpr {{.*}} 'A (*)(const A &, const DefaultA &)' <FunctionToPointerDecay> 172 // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'A (const A &, const DefaultA &)' lvalue Function {{.*}} 'foo' 'A (const A &, const DefaultA &)' 173 // CHECK-NEXT: | | |-MaterializeTemporaryExpr {{.*}} 'const A':'const P2718R0::A' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 174 // CHECK-NEXT: | | | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' <NoOp> 175 // CHECK-NEXT: | | | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' 176 // CHECK-NEXT: | | | `-CallExpr {{.*}} 'A':'P2718R0::A' 177 // CHECK-NEXT: | | | |-ImplicitCastExpr {{.*}} 'A (*)(const A &, const DefaultA &)' <FunctionToPointerDecay> 178 // CHECK-NEXT: | | | | `-DeclRefExpr {{.*}} 'A (const A &, const DefaultA &)' lvalue Function {{.*}} 'foo' 'A (const A &, const DefaultA &)' 179 // CHECK-NEXT: | | | |-MaterializeTemporaryExpr {{.*}} 'const A':'const P2718R0::A' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 180 // CHECK-NEXT: | | | | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' <NoOp> 181 // CHECK-NEXT: | | | | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' 182 // CHECK-NEXT: | | | | `-CXXTemporaryObjectExpr {{.*}} 'A':'P2718R0::A' 'void ()' 183 // CHECK-NEXT: | | | `-CXXDefaultArgExpr {{.*}} <<invalid sloc>> 'const DefaultA':'const P2718R0::DefaultA' lvalue has rewritten init 184 // CHECK-NEXT: | | | `-MaterializeTemporaryExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 185 // CHECK-NEXT: | | | `-ImplicitCastExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' <NoOp> 186 // CHECK-NEXT: | | | `-CXXBindTemporaryExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' (CXXTemporary {{.*}}) 187 // CHECK-NEXT: | | | `-CXXTemporaryObjectExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' 'void ()' 188 // CHECK-NEXT: | | `-CXXDefaultArgExpr {{.*}} <<invalid sloc>> 'const DefaultA':'const P2718R0::DefaultA' lvalue has rewritten init 189 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 190 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' <NoOp> 191 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' (CXXTemporary {{.*}}) 192 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' 'void ()' 193 // CHECK-NEXT: | `-CXXDefaultArgExpr {{.*}} <<invalid sloc>> 'const DefaultA':'const P2718R0::DefaultA' lvalue has rewritten init 194 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 195 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' <NoOp> 196 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' (CXXTemporary {{.*}}) 197 // CHECK-NEXT: | `-CXXTemporaryObjectExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' 'void ()' 198 for (auto e : default_arg_fn(foo(foo(foo(A()))))) 199 bar(e); 200 } 201 202 struct C : public A { 203 C() {} 204 C(int, const C &, const DefaultA & = DefaultA()) {} 205 }; 206 207 void test6() { 208 // CHECK: FunctionDecl {{.*}} test6 'void ()' 209 // CHECK: -CXXForRangeStmt {{.*}} 210 // CHECK-NEXT: |-<<<NULL>>> 211 // CHECK-NEXT: |-DeclStmt {{.*}} 212 // CHECK-NEXT: | `-VarDecl {{.*}} col:17 implicit used __range1 'C &&' cinit 213 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'C':'P2718R0::C' xvalue 214 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'C':'P2718R0::C' xvalue extended by Var {{.*}} '__range1' 'C &&' 215 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'C':'P2718R0::C' 216 // CHECK-NEXT: | `-CXXTemporaryObjectExpr {{.*}} 'C':'P2718R0::C' 'void (int, const C &, const DefaultA &)' 217 // CHECK-NEXT: | |-IntegerLiteral {{.*}}'int' 0 218 // CHECK-NEXT: | |-MaterializeTemporaryExpr {{.*}} 'const C':'const P2718R0::C' lvalue extended by Var {{.*}} '__range1' 'C &&' 219 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const C':'const P2718R0::C' <NoOp> 220 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'C':'P2718R0::C' 221 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'C':'P2718R0::C' 'void (int, const C &, const DefaultA &)' 222 // CHECK-NEXT: | | |-IntegerLiteral {{.*}} 'int' 0 223 // CHECK-NEXT: | | |-MaterializeTemporaryExpr {{.*}} 'const C':'const P2718R0::C' lvalue extended by Var {{.*}} '__range1' 'C &&' 224 // CHECK-NEXT: | | | `-ImplicitCastExpr {{.*}} 'const C':'const P2718R0::C' <NoOp> 225 // CHECK-NEXT: | | | `-CXXBindTemporaryExpr {{.*}} 'C':'P2718R0::C' 226 // CHECK-NEXT: | | | `-CXXTemporaryObjectExpr {{.*}} 'C':'P2718R0::C' 'void (int, const C &, const DefaultA &)' 227 // CHECK-NEXT: | | | |-IntegerLiteral {{.*}} 'int' 0 228 // CHECK-NEXT: | | | |-MaterializeTemporaryExpr {{.*}} 'const C':'const P2718R0::C' lvalue extended by Var {{.*}} '__range1' 'C &&' 229 // CHECK-NEXT: | | | | `-ImplicitCastExpr {{.*}} 'const C':'const P2718R0::C' <NoOp> 230 // CHECK-NEXT: | | | | `-CXXBindTemporaryExpr {{.*}} 'C':'P2718R0::C' 231 // CHECK-NEXT: | | | | `-CXXTemporaryObjectExpr {{.*}} 'C':'P2718R0::C' 'void ()' 232 // CHECK-NEXT: | | | `-CXXDefaultArgExpr {{.*}} <<invalid sloc>> 'const DefaultA':'const P2718R0::DefaultA' lvalue has rewritten init 233 // CHECK-NEXT: | | | `-MaterializeTemporaryExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' lvalue extended by Var {{.*}} '__range1' 'C &&' 234 // CHECK-NEXT: | | | `-ImplicitCastExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' <NoOp> 235 // CHECK-NEXT: | | | `-CXXBindTemporaryExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' (CXXTemporary {{.*}}) 236 // CHECK-NEXT: | | | `-CXXTemporaryObjectExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' 'void ()' 237 // CHECK-NEXT: | | `-CXXDefaultArgExpr {{.*}} <<invalid sloc>> 'const DefaultA':'const P2718R0::DefaultA' lvalue has rewritten init 238 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' lvalue extended by Var {{.*}} '__range1' 'C &&' 239 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' <NoOp> 240 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' (CXXTemporary {{.*}}) 241 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' 'void ()' 242 // CHECK-NEXT: | `-CXXDefaultArgExpr {{.*}} <<invalid sloc>> 'const DefaultA':'const P2718R0::DefaultA' lvalue has rewritten init 243 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' lvalue extended by Var {{.*}} '__range1' 'C &&' 244 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const DefaultA':'const P2718R0::DefaultA' <NoOp> 245 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' (CXXTemporary {{.*}}) 246 // CHECK-NEXT: | `-CXXTemporaryObjectExpr {{.*}} 'DefaultA':'P2718R0::DefaultA' 'void ()' 247 for (auto e : C(0, C(0, C(0, C())))) 248 bar(e); 249 } 250 251 // Test member call 252 void test7() { 253 // CHECK: FunctionDecl {{.*}} test7 'void ()' 254 // CHECK: -CXXForRangeStmt {{.*}} 255 // CHECK-NEXT: |-<<<NULL>>> 256 // CHECK-NEXT: |-DeclStmt {{.*}} 257 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'A &&' cinit 258 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'A':'P2718R0::A' xvalue 259 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'A':'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 260 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 261 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' 262 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .g {{.*}} 263 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' lvalue 264 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .r {{.*}} 265 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'A':'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 266 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 267 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' 268 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .g {{.*}} 269 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' lvalue 270 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .r {{.*}} 271 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'A':'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 272 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 273 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' 274 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .g {{.*}} 275 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' lvalue 276 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .r {{.*}} 277 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'A':'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 278 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 279 // CHECK-NEXT: | `-CallExpr {{.*}} 'A':'P2718R0::A' 280 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'A (*)()' <FunctionToPointerDecay> 281 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'A ()' lvalue Function {{.*}} 'g' 'A ()' 282 for (auto e : g().r().g().r().g().r().g()) 283 bar(e); 284 } 285 286 // Test basic && dependent context 287 template <typename T> T dg() { return T(); } 288 template <typename T> const T &df1(const T &t) { return t; } 289 290 void test8() { 291 [[maybe_unused]] int sum = 0; 292 // CHECK: FunctionDecl {{.*}} test8 'void ()' 293 // CHECK: -CXXForRangeStmt {{.*}} 294 // CHECK-NEXT: |-<<<NULL>>> 295 // CHECK-NEXT: |-DeclStmt {{.*}} 296 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'const P2718R0::A &' cinit 297 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'const P2718R0::A' lvalue 298 // CHECK-NEXT: | `-CallExpr {{.*}} 'const P2718R0::A' lvalue 299 // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} 'const P2718R0::A &(*)(const P2718R0::A &)' <FunctionToPointerDecay> 300 // CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'const P2718R0::A &(const P2718R0::A &)' lvalue Function {{.*}} 'df1' 'const P2718R0::A &(const P2718R0::A &)' (FunctionTemplate {{.*}} 'df1') 301 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const P2718R0::A' lvalue extended by Var {{.*}} '__range1' 'const P2718R0::A &' 302 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const P2718R0::A' <NoOp> 303 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'P2718R0::A' (CXXTemporary {{.*}}) 304 // CHECK-NEXT: | `-CallExpr {{.*}} 'P2718R0::A' 305 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'P2718R0::A (*)()' <FunctionToPointerDecay> 306 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'P2718R0::A ()' lvalue Function {{.*}} 'dg' 'P2718R0::A ()' (FunctionTemplate {{.*}} 'dg') 307 for (auto e : df1(dg<A>())) 308 sum += e; 309 } 310 311 template <typename T> int (&df2(const T *))[3]; 312 const A *dg2(const A &); 313 314 void test9() { 315 // CHECK: FunctionDecl {{.*}} test9 'void ()' 316 // CHECK: -CXXForRangeStmt {{.*}} 317 // CHECK-NEXT: |-<<<NULL>>> 318 // CHECK-NEXT: |-DeclStmt {{.*}} 319 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 320 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 321 // CHECK-NEXT: | `-CallExpr {{.*}} 'int[3]' lvalue 322 // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} 'int (&(*)(const P2718R0::A *))[3]' <FunctionToPointerDecay> 323 // CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'int (&(const P2718R0::A *))[3]' lvalue Function {{.*}} 'df2' 'int (&(const P2718R0::A *))[3]' (FunctionTemplate {{.*}} 'df2') 324 // CHECK-NEXT: | `-CallExpr {{.*}} 'const A *' 325 // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} 'const A *(*)(const A &)' <FunctionToPointerDecay> 326 // CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'const A *(const A &)' lvalue Function {{.*}} 'dg2' 'const A *(const A &)' 327 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const A':'const P2718R0::A' lvalue <DerivedToBase (A)> 328 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const B':'const P2718R0::B' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 329 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const B':'const P2718R0::B' <NoOp> 330 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'B':'P2718R0::B' (CXXTemporary {{.*}}) 331 // CHECK-NEXT: | `-CXXTemporaryObjectExpr {{.*}} 'B':'P2718R0::B' 'void () noexcept(false)' zeroing 332 for (auto e : df2(dg2(B()))) 333 bar(e); 334 } 335 336 // Test discard statement && dependent context 337 void test10() { 338 int v[] = {42, 17, 13}; 339 340 // CHECK: FunctionDecl {{.*}} test10 'void ()' 341 // CHECK: -CXXForRangeStmt {{.*}} 342 // CHECK-NEXT: |-<<<NULL>>> 343 // CHECK-NEXT: |-DeclStmt {{.*}} 344 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 345 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 346 // CHECK-NEXT: | `-BinaryOperator {{.*}} 'int[3]' lvalue ',' 347 // CHECK-NEXT: | |-CXXStaticCastExpr {{.*}} 'void' static_cast<void> <ToVoid> 348 // CHECK-NEXT: | | `-CallExpr {{.*}} 'const P2718R0::LockGuard' lvalue 349 // CHECK-NEXT: | | |-ImplicitCastExpr {{.*}} 'const P2718R0::LockGuard &(*)(const P2718R0::LockGuard &)' <FunctionToPointerDecay> 350 // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' lvalue Function {{.*}} 'df1' 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' (FunctionTemplate {{.*}} 'df1') 351 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 352 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' <NoOp> 353 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' (CXXTemporary {{.*}}) 354 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' 'void ()' 355 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'int[3]' lvalue Var {{.*}} 'v' 'int[3]' 356 for ([[maybe_unused]] int x : static_cast<void>(df1(LockGuard())), v) 357 LockGuard guard; 358 359 // CHECK: -CXXForRangeStmt {{.*}} 360 // CHECK-NEXT: |-<<<NULL>>> 361 // CHECK-NEXT: |-DeclStmt {{.*}} 362 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 363 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 364 // CHECK-NEXT: | `-BinaryOperator {{.*}} 'int[3]' lvalue ',' 365 // CHECK-NEXT: | |-CStyleCastExpr {{.*}} 'void' <ToVoid> 366 // CHECK-NEXT: | | `-CallExpr {{.*}} 'const P2718R0::LockGuard' lvalue 367 // CHECK-NEXT: | | |-ImplicitCastExpr {{.*}} 'const P2718R0::LockGuard &(*)(const P2718R0::LockGuard &)' <FunctionToPointerDecay> 368 // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' lvalue Function {{.*}} 'df1' 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' (FunctionTemplate {{.*}} 'df1') 369 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 370 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' <NoOp> 371 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' (CXXTemporary {{.*}}) 372 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' 'void ()' 373 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'int[3]' lvalue Var {{.*}} 'v' 'int[3]' 374 for ([[maybe_unused]] int x : (void)df1(LockGuard()), v) 375 LockGuard guard; 376 377 // CHECK: -CXXForRangeStmt {{.*}} 378 // CHECK-NEXT: |-<<<NULL>>> 379 // CHECK-NEXT: |-DeclStmt {{.*}} 380 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'int (&)[3]' cinit 381 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'int[3]' lvalue 382 // CHECK-NEXT: | `-BinaryOperator {{.*}} 'int[3]' lvalue ',' 383 // CHECK-NEXT: | |-BinaryOperator {{.*}} 'const P2718R0::LockGuard' lvalue ',' 384 // CHECK-NEXT: | | |-CallExpr {{.*}} 'const P2718R0::LockGuard' lvalue 385 // CHECK-NEXT: | | | |-ImplicitCastExpr {{.*}} 'const P2718R0::LockGuard &(*)(const P2718R0::LockGuard &)' <FunctionToPointerDecay> 386 // CHECK-NEXT: | | | | `-DeclRefExpr {{.*}} 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' lvalue Function {{.*}} 'df1' 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' (FunctionTemplate {{.*}} 'df1') 387 // CHECK-NEXT: | | | `-MaterializeTemporaryExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 388 // CHECK-NEXT: | | | `-ImplicitCastExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' <NoOp> 389 // CHECK-NEXT: | | | `-CXXBindTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' (CXXTemporary {{.*}}) 390 // CHECK-NEXT: | | | `-CXXTemporaryObjectExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' 'void ()' 391 // CHECK-NEXT: | | `-CallExpr {{.*}} 'const P2718R0::LockGuard' lvalue 392 // CHECK-NEXT: | | |-ImplicitCastExpr {{.*}} 'const P2718R0::LockGuard &(*)(const P2718R0::LockGuard &)' <FunctionToPointerDecay> 393 // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' lvalue Function {{.*}} 'df1' 'const P2718R0::LockGuard &(const P2718R0::LockGuard &)' (FunctionTemplate {{.*}} 'df1') 394 // CHECK-NEXT: | | `-MaterializeTemporaryExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' lvalue extended by Var {{.*}} '__range1' 'int (&)[3]' 395 // CHECK-NEXT: | | `-ImplicitCastExpr {{.*}} 'const LockGuard':'const P2718R0::LockGuard' <NoOp> 396 // CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' (CXXTemporary {{.*}}) 397 // CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'LockGuard':'P2718R0::LockGuard' 'void ()' 398 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'int[3]' lvalue Var {{.*}} 'v' 'int[3]' 399 for ([[maybe_unused]] int x : df1(LockGuard()), df1(LockGuard()), v) 400 LockGuard guard; 401 } 402 403 // Test default argument && dependent context 404 template <typename T> int (&default_arg_fn2(const T & = T()))[3]; 405 void test11() { 406 for (auto e : default_arg_fn2<A>()) 407 bar(e); 408 } 409 410 template <typename T> A foo2(const T&, const DefaultA &Default = DefaultA()); 411 412 void test12() { 413 for (auto e : default_arg_fn2(foo2(foo2(foo2(A()))))) 414 bar(e); 415 } 416 417 // Test member call && dependent context 418 void test13() { 419 420 // CHECK: FunctionDecl {{.*}} test13 'void ()' 421 // CHECK: -CXXForRangeStmt {{.*}} 422 // CHECK-NEXT: |-<<<NULL>>> 423 // CHECK-NEXT: |-DeclStmt {{.*}} 424 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'A &&' cinit 425 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'A':'P2718R0::A' xvalue 426 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'A':'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 427 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 428 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' 429 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .g {{.*}} 430 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' lvalue 431 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .r {{.*}} 432 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'A':'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 433 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 434 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' 435 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .g {{.*}} 436 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' lvalue 437 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .r {{.*}} 438 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'A':'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 439 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A':'P2718R0::A' (CXXTemporary {{.*}}) 440 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' 441 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .g {{.*}} 442 // CHECK-NEXT: | `-CXXMemberCallExpr {{.*}} 'A':'P2718R0::A' lvalue 443 // CHECK-NEXT: | `-MemberExpr {{.*}} '<bound member function type>' .r {{.*}} 444 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'P2718R0::A' xvalue extended by Var {{.*}} '__range1' 'A &&' 445 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'P2718R0::A' (CXXTemporary {{.*}}) 446 // CHECK-NEXT: | `-CallExpr {{.*}} 'P2718R0::A' 447 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'P2718R0::A (*)()' <FunctionToPointerDecay> 448 // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'P2718R0::A ()' lvalue Function {{.*}} 'dg' 'P2718R0::A ()' (FunctionTemplate {{.*}} 'dg') 449 for (auto e : dg<A>().r().g().r().g().r().g()) 450 bar(e); 451 } 452 453 extern "C" void exit(int); 454 455 struct A14 { 456 int arr[1]; 457 ~A14() noexcept(false) { throw 42; } 458 }; 459 460 struct B14 { 461 int x; 462 const A14 &a = A14{{0}}; 463 const int *begin() { return a.arr; } 464 const int *end() { return &a.arr[1]; } 465 }; 466 467 void test14() { 468 // The ExprWithCleanups in CXXDefaultInitExpr will be ignored. 469 470 // CHECK: FunctionDecl {{.*}} test14 'void ()' 471 // CHECK: -CXXForRangeStmt {{.*}} 472 // CHECK-NEXT: |-<<<NULL>>> 473 // CHECK-NEXT: |-DeclStmt {{.*}} 474 // CHECK-NEXT: | `-VarDecl {{.*}} implicit used __range1 'const int (&)[1]' cinit 475 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'const int[1]' lvalue 476 // CHECK-NEXT: | `-MemberExpr {{.*}} 'const int[1]' lvalue .arr {{.*}} 477 // CHECK-NEXT: | `-MemberExpr {{.*}} 'const A14':'const P2718R0::A14' lvalue .a {{.*}} 478 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'B14':'P2718R0::B14' xvalue extended by Var {{.*}} '__range1' 'const int (&)[1]' 479 // CHECK-NEXT: | `-CXXFunctionalCastExpr {{.*}} 'B14':'P2718R0::B14' functional cast to B14 <NoOp> 480 // CHECK-NEXT: | `-InitListExpr {{.*}} 'B14':'P2718R0::B14' 481 // CHECK-NEXT: | |-IntegerLiteral {{.*}} 'int' 0 482 // CHECK-NEXT: | `-CXXDefaultInitExpr {{.*}} 'const A14':'const P2718R0::A14' lvalue has rewritten init 483 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const A14':'const P2718R0::A14' lvalue extended by Var {{.*}} '__range1' 'const int (&)[1]' 484 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const A14':'const P2718R0::A14' <NoOp> 485 // CHECK-NEXT: | `-CXXFunctionalCastExpr {{.*}} 'A14':'P2718R0::A14' functional cast to A14 <NoOp> 486 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A14':'P2718R0::A14' (CXXTemporary {{.*}}) 487 // CHECK-NEXT: | `-InitListExpr {{.*}} 'A14':'P2718R0::A14' 488 // CHECK-NEXT: | `-InitListExpr {{.*}} 'int[1]' 489 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 0 490 for (auto &&x : B14{0}.a.arr) { exit(0); } 491 492 // CHECK: -CXXForRangeStmt {{.*}} 493 // CHECK-NEXT: |-<<<NULL>>> 494 // CHECK-NEXT: |-DeclStmt {{.*}} 495 // CHECK-NEXT: | `-VarDecl {{.*}} col:19 implicit used __range1 'B14 &&' cinit 496 // CHECK-NEXT: | `-ExprWithCleanups {{.*}} 'B14':'P2718R0::B14' xvalue 497 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'B14':'P2718R0::B14' xvalue extended by Var {{.*}} '__range1' 'B14 &&' 498 // CHECK-NEXT: | `-CXXFunctionalCastExpr {{.*}} 'B14':'P2718R0::B14' functional cast to B14 <NoOp> 499 // CHECK-NEXT: | `-InitListExpr {{.*}} 'B14':'P2718R0::B14' 500 // CHECK-NEXT: | |-IntegerLiteral {{.*}} 'int' 0 501 // CHECK-NEXT: | `-CXXDefaultInitExpr {{.*}} 'const A14':'const P2718R0::A14' lvalue has rewritten init 502 // CHECK-NEXT: | `-MaterializeTemporaryExpr {{.*}} 'const A14':'const P2718R0::A14' lvalue extended by Var {{.*}} '__range1' 'B14 &&' 503 // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} 'const A14':'const P2718R0::A14' <NoOp> 504 // CHECK-NEXT: | `-CXXFunctionalCastExpr {{.*}} 'A14':'P2718R0::A14' functional cast to A14 <NoOp> 505 // CHECK-NEXT: | `-CXXBindTemporaryExpr {{.*}} 'A14':'P2718R0::A14' (CXXTemporary {{.*}}) 506 // CHECK-NEXT: | `-InitListExpr {{.*}} 'A14':'P2718R0::A14' 507 // CHECK-NEXT: | `-InitListExpr {{.*}} 'int[1]' 508 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 0 509 for (auto &&x : B14{0}) { exit(0); } 510 } 511 } // namespace P2718R0 512