1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
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
14 struct CorrectConvert
{
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
221 using ShortTy
= short;
222 static constexpr int value
= 1;
228 TemplUses
<CorrectConvert
, HasInt
>({}, {});