xref: /llvm-project/clang/test/SemaOpenACC/loop-ast.cpp (revision e4d57d6a729fd955ccbdd8834065356f26284f3d)
1 
2 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
3 
4 // Test this with PCH.
5 // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
6 // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
7 
8 #ifndef PCH_HELPER
9 #define PCH_HELPER
10 
11 void NormalFunc() {
12   // CHECK-LABEL: NormalFunc
13   // CHECK-NEXT: CompoundStmt
14 
15 #pragma acc loop
16   for(int i = 0; i < 5;++i);
17   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
18   // CHECK-NEXT: ForStmt
19   // CHECK-NEXT: DeclStmt
20   // CHECK-NEXT: VarDecl {{.*}} used i 'int'
21   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
22   // CHECK-NEXT: <<<NULL>>
23   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
24   // CHECK-NEXT: ImplicitCastExpr
25   // CHECK-NEXT: DeclRefExpr
26   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
27   // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
28   // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
29   // CHECK-NEXT: NullStmt
30 
31   int array[5];
32   // CHECK-NEXT: DeclStmt
33   // CHECK-NEXT: VarDecl
34 #pragma acc loop
35   for(auto x : array){}
36   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
37   // CHECK-NEXT: CXXForRangeStmt
38   // CHECK: CompoundStmt
39 
40 #pragma acc parallel
41   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
42   // CHECK-NEXT: CompoundStmt
43   {
44 #pragma acc parallel
45     // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
46     // CHECK-NEXT: CompoundStmt
47     {
48 #pragma acc loop
49       for(int i = 0; i < 5;++i);
50     // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
51     // CHECK-NEXT: ForStmt
52     // CHECK-NEXT: DeclStmt
53     // CHECK-NEXT: VarDecl {{.*}} used i 'int'
54     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
55     // CHECK-NEXT: <<<NULL>>>
56     // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
57     // CHECK-NEXT: ImplicitCastExpr
58     // CHECK-NEXT: DeclRefExpr
59     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
60     // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
61     // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
62     // CHECK-NEXT: NullStmt
63     }
64   }
65 }
66 
67 template<typename T>
68 void TemplFunc() {
69   // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
70   // CHECK-NEXT: TemplateTypeParmDecl
71   // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc
72   // CHECK-NEXT: CompoundStmt
73 
74 #pragma acc loop
75   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
76   for(typename T::type t = 0; t < 5;++t) {
77   // CHECK-NEXT: ForStmt
78   // CHECK-NEXT: DeclStmt
79   // CHECK-NEXT: VarDecl{{.*}} referenced t 'typename T::type'
80   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
81   // CHECK-NEXT: <<<NULL>>
82   // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'
83   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var
84   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
85   // CHECK-NEXT: UnaryOperator{{.*}} '<dependent type>' lvalue prefix '++'
86   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename T::type' lvalue Var
87   // CHECK-NEXT: CompoundStmt
88     typename T::type I;
89   // CHECK-NEXT: DeclStmt
90   // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type'
91 
92   }
93 
94 #pragma acc serial
95   {
96     // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
97     // CHECK-NEXT: CompoundStmt
98 #pragma acc parallel
99     {
100     // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
101     // CHECK-NEXT: CompoundStmt
102 #pragma acc loop
103     // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
104     // CHECK-NEXT: ForStmt
105     // CHECK-NEXT: DeclStmt
106     // CHECK-NEXT: VarDecl {{.*}} i 'int'
107     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
108     // CHECK-NEXT: <<<NULL>>>
109     // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
110     // CHECK-NEXT: ImplicitCastExpr
111     // CHECK-NEXT: DeclRefExpr
112     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
113     // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
114     // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
115     // CHECK-NEXT: NullStmt
116       for(int i = 0; i < 5;++i);
117 
118 #pragma acc loop
119     // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
120     // CHECK-NEXT: ForStmt
121     // CHECK-NEXT: DeclStmt
122     // CHECK-NEXT: VarDecl {{.*}} i 'int'
123     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
124     // CHECK-NEXT: <<<NULL>>>
125     // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
126     // CHECK-NEXT: ImplicitCastExpr
127     // CHECK-NEXT: DeclRefExpr
128     // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
129     // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
130     // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
131     // CHECK-NEXT: NullStmt
132       for(int i = 0; i < 5;++i);
133     }
134   }
135 
136   typename T::type array[5];
137   // CHECK-NEXT: DeclStmt
138   // CHECK-NEXT: VarDecl
139 
140 #pragma acc loop
141   for(auto x : array){}
142   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
143   // CHECK-NEXT: CXXForRangeStmt
144   // CHECK: CompoundStmt
145 
146   // Instantiation:
147   // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void ()' implicit_instantiation
148   // CHECK-NEXT: TemplateArgument type 'S'
149   // CHECK-NEXT: RecordType{{.*}} 'S'
150   // CHECK-NEXT: CXXRecord{{.*}} 'S'
151   // CHECK-NEXT: CompoundStmt
152 
153   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
154   // CHECK-NEXT: ForStmt
155   // CHECK-NEXT: DeclStmt
156   // CHECK-NEXT: VarDecl{{.*}} used t 'typename S::type':'int'
157   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
158   // CHECK-NEXT: <<<NULL>>
159   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
160   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'typename S::type':'int' <LValueToRValue>
161   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var
162   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
163   // CHECK-NEXT: UnaryOperator{{.*}} 'typename S::type':'int' lvalue prefix '++'
164   // CHECK-NEXT: DeclRefExpr {{.*}} 'typename S::type':'int' lvalue Var
165   // CHECK-NEXT: CompoundStmt
166   // CHECK-NEXT: DeclStmt
167   // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int'
168 
169   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial
170   // CHECK-NEXT: CompoundStmt
171   //
172   // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel
173   // CHECK-NEXT: CompoundStmt
174 
175   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
176   // CHECK-NEXT: ForStmt
177   // CHECK-NEXT: DeclStmt
178   // CHECK-NEXT: VarDecl {{.*}} i 'int'
179   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
180   // CHECK-NEXT: <<<NULL>>>
181   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
182   // CHECK-NEXT: ImplicitCastExpr
183   // CHECK-NEXT: DeclRefExpr
184   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
185   // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
186   // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
187   // CHECK-NEXT: NullStmt
188 
189   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} parent: parallel
190   // CHECK-NEXT: ForStmt
191   // CHECK-NEXT: DeclStmt
192   // CHECK-NEXT: VarDecl {{.*}} i 'int'
193   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
194   // CHECK-NEXT: <<<NULL>>>
195   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
196   // CHECK-NEXT: ImplicitCastExpr
197   // CHECK-NEXT: DeclRefExpr
198   // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
199   // CHECK-NEXT: UnaryOperator{{.*}} prefix '++'
200   // CHECK-NEXT: DeclRefExpr{{.*}} 'i' 'int'
201   // CHECK-NEXT: NullStmt
202 
203   // CHECK-NEXT: DeclStmt
204   // CHECK-NEXT: VarDecl
205   // CHECK-NEXT: OpenACCLoopConstruct{{.*}} <orphan>
206   // CHECK-NEXT: CXXForRangeStmt
207   // CHECK: CompoundStmt
208 }
209 
210 struct S {
211   using type = int;
212 };
213 
214 void use() {
215   TemplFunc<S>();
216 }
217 #endif
218 
219