xref: /llvm-project/clang/test/SemaOpenACC/loop-ast.cpp (revision e4d57d6a729fd955ccbdd8834065356f26284f3d)
142f4e505SErich Keane 
242f4e505SErich Keane // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
342f4e505SErich Keane 
442f4e505SErich Keane // Test this with PCH.
542f4e505SErich Keane // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
642f4e505SErich Keane // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
742f4e505SErich Keane 
842f4e505SErich Keane #ifndef PCH_HELPER
942f4e505SErich Keane #define PCH_HELPER
1042f4e505SErich Keane 
1142f4e505SErich Keane void NormalFunc() {
1242f4e505SErich Keane   // CHECK-LABEL: NormalFunc
1342f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
1442f4e505SErich Keane 
1542f4e505SErich Keane #pragma acc loop
16b0cfbfd7SErich Keane   for(int i = 0; i < 5;++i);
1742f4e505SErich Keane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
1842f4e505SErich Keane   // CHECK-NEXT: ForStmt
19b0cfbfd7SErich Keane   // CHECK-NEXT: DeclStmt
20b0cfbfd7SErich Keane   // CHECK-NEXT: VarDecl {{.*}} used i 'int'
21b0cfbfd7SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
22b0cfbfd7SErich Keane   // CHECK-NEXT: <<<NULL>>
23b0cfbfd7SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
24b0cfbfd7SErich Keane   // CHECK-NEXT: ImplicitCastExpr
25b0cfbfd7SErich Keane   // CHECK-NEXT: DeclRefExpr
26b0cfbfd7SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
27b0cfbfd7SErich Keane   // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
28b0cfbfd7SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
2942f4e505SErich Keane   // CHECK-NEXT: NullStmt
3042f4e505SErich Keane 
3142f4e505SErich Keane   int array[5];
3242f4e505SErich Keane   // CHECK-NEXT: DeclStmt
3342f4e505SErich Keane   // CHECK-NEXT: VarDecl
3442f4e505SErich Keane #pragma acc loop
3542f4e505SErich Keane   for(auto x : array){}
3642f4e505SErich Keane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
3742f4e505SErich Keane   // CHECK-NEXT: CXXForRangeStmt
3842f4e505SErich Keane   // CHECK: CompoundStmt
3942f4e505SErich Keane 
4042f4e505SErich Keane #pragma acc parallel
4142f4e505SErich Keane   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
4242f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
4342f4e505SErich Keane   {
4442f4e505SErich Keane #pragma acc parallel
45*e4d57d6aSerichkeane     // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
4642f4e505SErich Keane     // CHECK-NEXT: CompoundStmt
4742f4e505SErich Keane     {
4842f4e505SErich Keane #pragma acc loop
49b0cfbfd7SErich Keane       for(int i = 0; i < 5;++i);
50*e4d57d6aSerichkeane     // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
5142f4e505SErich Keane     // CHECK-NEXT: ForStmt
52b0cfbfd7SErich Keane     // CHECK-NEXT: DeclStmt
53b0cfbfd7SErich Keane     // CHECK-NEXT: VarDecl {{.*}} used i 'int'
54b0cfbfd7SErich Keane     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
5542f4e505SErich Keane     // CHECK-NEXT: <<<NULL>>>
56b0cfbfd7SErich Keane     // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
57b0cfbfd7SErich Keane     // CHECK-NEXT: ImplicitCastExpr
58b0cfbfd7SErich Keane     // CHECK-NEXT: DeclRefExpr
59b0cfbfd7SErich Keane     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
60b0cfbfd7SErich Keane     // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
61b0cfbfd7SErich Keane     // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
6242f4e505SErich Keane     // CHECK-NEXT: NullStmt
6342f4e505SErich Keane     }
6442f4e505SErich Keane   }
6542f4e505SErich Keane }
6642f4e505SErich Keane 
6742f4e505SErich Keane template<typename T>
6842f4e505SErich Keane void TemplFunc() {
6942f4e505SErich Keane   // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
7042f4e505SErich Keane   // CHECK-NEXT: TemplateTypeParmDecl
7142f4e505SErich Keane   // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
7242f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
7342f4e505SErich Keane 
7442f4e505SErich Keane #pragma acc loop
7542f4e505SErich Keane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
7642f4e505SErich Keane   for(typename T::type t = 0; t < 5;++t) {
7742f4e505SErich Keane   // CHECK-NEXT: ForStmt
7842f4e505SErich Keane   // CHECK-NEXT: DeclStmt
7942f4e505SErich Keane   // CHECK-NEXT: VarDecl{{.*}} referenced t 'typename T::type'
8042f4e505SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
8142f4e505SErich Keane   // CHECK-NEXT: <<<NULL>>
8242f4e505SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'
8342f4e505SErich Keane   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var
8442f4e505SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
8542f4e505SErich Keane   // CHECK-NEXT: UnaryOperator{{.*}} '<dependent type>' lvalue prefix '++'
8642f4e505SErich Keane   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var
8742f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
8842f4e505SErich Keane     typename T::type I;
8942f4e505SErich Keane   // CHECK-NEXT: DeclStmt
9042f4e505SErich Keane   // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type'
9142f4e505SErich Keane 
9242f4e505SErich Keane   }
9342f4e505SErich Keane 
94*e4d57d6aSerichkeane #pragma acc serial
95*e4d57d6aSerichkeane   {
96*e4d57d6aSerichkeane     // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
97*e4d57d6aSerichkeane     // CHECK-NEXT: CompoundStmt
9842f4e505SErich Keane #pragma acc parallel
9942f4e505SErich Keane     {
10042f4e505SErich Keane     // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
10142f4e505SErich Keane     // CHECK-NEXT: CompoundStmt
10242f4e505SErich Keane #pragma acc loop
103*e4d57d6aSerichkeane     // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
10442f4e505SErich Keane     // CHECK-NEXT: ForStmt
105b0cfbfd7SErich Keane     // CHECK-NEXT: DeclStmt
106b0cfbfd7SErich Keane     // CHECK-NEXT: VarDecl {{.*}} i 'int'
107b0cfbfd7SErich Keane     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
10842f4e505SErich Keane     // CHECK-NEXT: <<<NULL>>>
109b0cfbfd7SErich Keane     // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
110b0cfbfd7SErich Keane     // CHECK-NEXT: ImplicitCastExpr
111b0cfbfd7SErich Keane     // CHECK-NEXT: DeclRefExpr
112b0cfbfd7SErich Keane     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
113b0cfbfd7SErich Keane     // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
114b0cfbfd7SErich Keane     // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
11542f4e505SErich Keane     // CHECK-NEXT: NullStmt
116b0cfbfd7SErich Keane       for(int i = 0; i < 5;++i);
11742f4e505SErich Keane 
11842f4e505SErich Keane #pragma acc loop
119*e4d57d6aSerichkeane     // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
12042f4e505SErich Keane     // CHECK-NEXT: ForStmt
121b0cfbfd7SErich Keane     // CHECK-NEXT: DeclStmt
122b0cfbfd7SErich Keane     // CHECK-NEXT: VarDecl {{.*}} i 'int'
123b0cfbfd7SErich Keane     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
12442f4e505SErich Keane     // CHECK-NEXT: <<<NULL>>>
125b0cfbfd7SErich Keane     // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
126b0cfbfd7SErich Keane     // CHECK-NEXT: ImplicitCastExpr
127b0cfbfd7SErich Keane     // CHECK-NEXT: DeclRefExpr
128b0cfbfd7SErich Keane     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
129b0cfbfd7SErich Keane     // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
130b0cfbfd7SErich Keane     // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
13142f4e505SErich Keane     // CHECK-NEXT: NullStmt
132b0cfbfd7SErich Keane       for(int i = 0; i < 5;++i);
13342f4e505SErich Keane     }
13442f4e505SErich Keane   }
13542f4e505SErich Keane 
13642f4e505SErich Keane   typename T::type array[5];
13742f4e505SErich Keane   // CHECK-NEXT: DeclStmt
13842f4e505SErich Keane   // CHECK-NEXT: VarDecl
13942f4e505SErich Keane 
14042f4e505SErich Keane #pragma acc loop
14142f4e505SErich Keane   for(auto x : array){}
14242f4e505SErich Keane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
14342f4e505SErich Keane   // CHECK-NEXT: CXXForRangeStmt
14442f4e505SErich Keane   // CHECK: CompoundStmt
14542f4e505SErich Keane 
14642f4e505SErich Keane   // Instantiation:
14742f4e505SErich Keane   // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation
14842f4e505SErich Keane   // CHECK-NEXT: TemplateArgument type 'S'
14942f4e505SErich Keane   // CHECK-NEXT: RecordType{{.*}} 'S'
15042f4e505SErich Keane   // CHECK-NEXT: CXXRecord{{.*}} 'S'
15142f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
15242f4e505SErich Keane 
15342f4e505SErich Keane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
15442f4e505SErich Keane   // CHECK-NEXT: ForStmt
15542f4e505SErich Keane   // CHECK-NEXT: DeclStmt
15642f4e505SErich Keane   // CHECK-NEXT: VarDecl{{.*}} used t 'typename S::type':'int'
15742f4e505SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
15842f4e505SErich Keane   // CHECK-NEXT: <<<NULL>>
15942f4e505SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
16042f4e505SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'typename S::type':'int' <LValueToRValue>
16142f4e505SErich Keane   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var
16242f4e505SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
16342f4e505SErich Keane   // CHECK-NEXT: UnaryOperator{{.*}} 'typename S::type':'int' lvalue prefix '++'
16442f4e505SErich Keane   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var
16542f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
16642f4e505SErich Keane   // CHECK-NEXT: DeclStmt
16742f4e505SErich Keane   // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'
16842f4e505SErich Keane 
169*e4d57d6aSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
17042f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
17142f4e505SErich Keane   //
172*e4d57d6aSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
17342f4e505SErich Keane   // CHECK-NEXT: CompoundStmt
17442f4e505SErich Keane 
175*e4d57d6aSerichkeane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
17642f4e505SErich Keane   // CHECK-NEXT: ForStmt
177b0cfbfd7SErich Keane   // CHECK-NEXT: DeclStmt
178b0cfbfd7SErich Keane   // CHECK-NEXT: VarDecl {{.*}} i 'int'
179b0cfbfd7SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
18042f4e505SErich Keane   // CHECK-NEXT: <<<NULL>>>
181b0cfbfd7SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
182b0cfbfd7SErich Keane   // CHECK-NEXT: ImplicitCastExpr
183b0cfbfd7SErich Keane   // CHECK-NEXT: DeclRefExpr
184b0cfbfd7SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
185b0cfbfd7SErich Keane   // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
186b0cfbfd7SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
18742f4e505SErich Keane   // CHECK-NEXT: NullStmt
18842f4e505SErich Keane 
189*e4d57d6aSerichkeane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
19042f4e505SErich Keane   // CHECK-NEXT: ForStmt
191b0cfbfd7SErich Keane   // CHECK-NEXT: DeclStmt
192b0cfbfd7SErich Keane   // CHECK-NEXT: VarDecl {{.*}} i 'int'
193b0cfbfd7SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
19442f4e505SErich Keane   // CHECK-NEXT: <<<NULL>>>
195b0cfbfd7SErich Keane   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
196b0cfbfd7SErich Keane   // CHECK-NEXT: ImplicitCastExpr
197b0cfbfd7SErich Keane   // CHECK-NEXT: DeclRefExpr
198b0cfbfd7SErich Keane   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
199b0cfbfd7SErich Keane   // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
200b0cfbfd7SErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
20142f4e505SErich Keane   // CHECK-NEXT: NullStmt
20242f4e505SErich Keane 
20342f4e505SErich Keane   // CHECK-NEXT: DeclStmt
20442f4e505SErich Keane   // CHECK-NEXT: VarDecl
20542f4e505SErich Keane   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
20642f4e505SErich Keane   // CHECK-NEXT: CXXForRangeStmt
20742f4e505SErich Keane   // CHECK: CompoundStmt
20842f4e505SErich Keane }
20942f4e505SErich Keane 
21042f4e505SErich Keane struct S {
21142f4e505SErich Keane   using type = int;
21242f4e505SErich Keane };
21342f4e505SErich Keane 
21442f4e505SErich Keane void use() {
21542f4e505SErich Keane   TemplFunc<S>();
21642f4e505SErich Keane }
21742f4e505SErich Keane #endif
21842f4e505SErich Keane 
219