[flang][OpenMP] 'no_openmp_constructs' added to clang broke flang build (#126145)
[llvm-project.git] / clang / test / SemaOpenACC / combined-construct-num_workers-ast.cpp
blob8aa361c7b037c0dc4dce2f9af724d79dfd9c31d0
1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
3 // Test this with PCH.
4 // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
5 // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
7 #ifndef PCH_HELPER
8 #define PCH_HELPER
9 int some_int();
10 short some_short();
11 long some_long();
12 enum E{};
13 E some_enum();
14 struct CorrectConvert {
15 operator int();
16 } Convert;
19 void NormalUses() {
20 // CHECK: FunctionDecl{{.*}}NormalUses
21 // CHECK-NEXT: CompoundStmt
22 #pragma acc parallel loop num_workers(some_int())
23 for (unsigned i = 0; i < 5; ++i);
24 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
25 // CHECK-NEXT: num_workers clause
26 // CHECK-NEXT: CallExpr{{.*}}'int'
27 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
28 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
29 // CHECK-NEXT: ForStmt
30 // CHECK: NullStmt
32 #pragma acc kernels loop num_workers(some_short())
33 for (unsigned i = 0; i < 5; ++i);
34 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
35 // CHECK-NEXT: num_workers clause
36 // CHECK-NEXT: CallExpr{{.*}}'short'
37 // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>
38 // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'
39 // CHECK-NEXT: ForStmt
40 // CHECK: NullStmt
42 #pragma acc parallel loop num_workers(some_long())
43 for (unsigned i = 0; i < 5; ++i);
44 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
45 // CHECK-NEXT: num_workers clause
46 // CHECK-NEXT: CallExpr{{.*}}'long'
47 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
48 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
49 // CHECK-NEXT: ForStmt
50 // CHECK: NullStmt
52 #pragma acc parallel loop num_workers(some_enum())
53 for (unsigned i = 0; i < 5; ++i);
54 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
55 // CHECK-NEXT: num_workers clause
56 // CHECK-NEXT: CallExpr{{.*}}'E'
57 // CHECK-NEXT: ImplicitCastExpr{{.*}}'E (*)()' <FunctionToPointerDecay>
58 // CHECK-NEXT: DeclRefExpr{{.*}}'E ()' lvalue Function{{.*}} 'some_enum' 'E ()'
59 // CHECK-NEXT: ForStmt
60 // CHECK: NullStmt
62 #pragma acc kernels loop num_workers(Convert)
63 for (unsigned i = 0; i < 5; ++i);
64 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
65 // CHECK-NEXT: num_workers clause
66 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
67 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
68 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
69 // CHECK-NEXT: DeclRefExpr{{.*}} 'struct CorrectConvert':'CorrectConvert' lvalue Var
70 // CHECK-NEXT: ForStmt
71 // CHECK: NullStmt
74 template<typename T, typename U>
75 void TemplUses(T t, U u) {
76 // CHECK-NEXT: FunctionTemplateDecl
77 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T
78 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 U
79 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'
80 // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
81 // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
82 // CHECK-NEXT: CompoundStmt
84 #pragma acc parallel loop num_workers(t)
85 for (unsigned i = 0; i < 5; ++i);
86 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
87 // CHECK-NEXT: num_workers clause
88 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue ParmVar{{.*}} 't' 'T'
89 // CHECK-NEXT: ForStmt
90 // CHECK: NullStmt
92 #pragma acc kernels loop num_workers(u)
93 for (unsigned i = 0; i < 5; ++i);
94 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
95 // CHECK-NEXT: num_workers clause
96 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
97 // CHECK-NEXT: ForStmt
98 // CHECK: NullStmt
100 #pragma acc parallel loop num_workers(U::value)
101 for (unsigned i = 0; i < 5; ++i);
102 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
103 // CHECK-NEXT: num_workers clause
104 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
105 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
106 // CHECK-NEXT: ForStmt
107 // CHECK: NullStmt
109 #pragma acc kernels loop num_workers(T{})
110 for (unsigned i = 0; i < 5; ++i);
111 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
112 // CHECK-NEXT: num_workers clause
113 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'T' 'T' list
114 // CHECK-NEXT: InitListExpr{{.*}} 'void'
115 // CHECK-NEXT: ForStmt
116 // CHECK: NullStmt
118 #pragma acc parallel loop num_workers(U{})
119 for (unsigned i = 0; i < 5; ++i);
120 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
121 // CHECK-NEXT: num_workers clause
122 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'U' 'U' list
123 // CHECK-NEXT: InitListExpr{{.*}} 'void'
124 // CHECK-NEXT: ForStmt
125 // CHECK: NullStmt
127 #pragma acc kernels loop num_workers(typename U::IntTy{})
128 for (unsigned i = 0; i < 5; ++i);
129 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
130 // CHECK-NEXT: num_workers clause
131 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::IntTy' 'typename U::IntTy' list
132 // CHECK-NEXT: InitListExpr{{.*}} 'void'
133 // CHECK-NEXT: ForStmt
134 // CHECK: NullStmt
136 #pragma acc parallel loop num_workers(typename U::ShortTy{})
137 for (unsigned i = 0; i < 5; ++i);
138 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
139 // CHECK-NEXT: num_workers clause
140 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::ShortTy' 'typename U::ShortTy' list
141 // CHECK-NEXT: InitListExpr{{.*}} 'void'
142 // CHECK-NEXT: ForStmt
143 // CHECK: NullStmt
145 // Check the instantiated versions of the above.
146 // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (CorrectConvert, HasInt)' implicit_instantiation
147 // CHECK-NEXT: TemplateArgument type 'CorrectConvert'
148 // CHECK-NEXT: RecordType{{.*}} 'CorrectConvert'
149 // CHECK-NEXT: CXXRecord{{.*}} 'CorrectConvert'
150 // CHECK-NEXT: TemplateArgument type 'HasInt'
151 // CHECK-NEXT: RecordType{{.*}} 'HasInt'
152 // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'
153 // CHECK-NEXT: ParmVarDecl{{.*}} used t 'CorrectConvert'
154 // CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'
155 // CHECK-NEXT: CompoundStmt
157 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
158 // CHECK-NEXT: num_workers clause
159 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
160 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
161 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
162 // CHECK-NEXT: DeclRefExpr{{.*}} 'CorrectConvert' lvalue ParmVar
163 // CHECK-NEXT: ForStmt
164 // CHECK: NullStmt
166 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
167 // CHECK-NEXT: num_workers clause
168 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
169 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
170 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
171 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
172 // CHECK-NEXT: ForStmt
173 // CHECK: NullStmt
175 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
176 // CHECK-NEXT: num_workers clause
177 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
178 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
179 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
180 // CHECK-NEXT: ForStmt
181 // CHECK: NullStmt
183 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
184 // CHECK-NEXT: num_workers clause
185 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>
186 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
187 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int
188 // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'CorrectConvert' lvalue
189 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'CorrectConvert' functional cast to struct CorrectConvert <NoOp>
190 // CHECK-NEXT: InitListExpr{{.*}}'CorrectConvert'
191 // CHECK-NEXT: ForStmt
192 // CHECK: NullStmt
194 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
195 // CHECK-NEXT: num_workers clause
196 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
197 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
198 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
199 // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'HasInt' lvalue
200 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'HasInt' functional cast to struct HasInt <NoOp>
201 // CHECK-NEXT: InitListExpr{{.*}}'HasInt'
202 // CHECK-NEXT: ForStmt
203 // CHECK: NullStmt
205 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
206 // CHECK-NEXT: num_workers clause
207 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::IntTy':'int' functional cast to typename struct HasInt::IntTy <NoOp>
208 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::IntTy':'int'
209 // CHECK-NEXT: ForStmt
210 // CHECK: NullStmt
212 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
213 // CHECK-NEXT: num_workers clause
214 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::ShortTy':'short' functional cast to typename struct HasInt::ShortTy <NoOp>
215 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'
216 // CHECK-NEXT: ForStmt
217 // CHECK: NullStmt
219 struct HasInt {
220 using IntTy = int;
221 using ShortTy = short;
222 static constexpr int value = 1;
224 operator char();
227 void Inst() {
228 TemplUses<CorrectConvert, HasInt>({}, {});
230 #endif // PCH_HELPER