Skip to content

Commit 35a5c71

Browse files
committed
[OpenACC] Add tests forgotten in 969b765
1 parent 9d55e86 commit 35a5c71

File tree

3 files changed

+385
-0
lines changed

3 files changed

+385
-0
lines changed
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
2+
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
6+
7+
#ifndef PCH_HELPER
8+
#define PCH_HELPER
9+
10+
int some_int();
11+
long some_long();
12+
13+
void NormalUses() {
14+
// CHECK: FunctionDecl{{.*}}NormalUses
15+
// CHECK-NEXT: CompoundStmt
16+
17+
#pragma acc parallel loop wait
18+
for (int i = 0; i < 5; ++i) {}
19+
// CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop
20+
// CHECK-NEXT: wait clause
21+
// CHECK-NEXT: <<<NULL>>>
22+
// CHECK-NEXT: ForStmt
23+
#pragma acc serial loop wait()
24+
for (int i = 0; i < 5; ++i) {}
25+
// CHECK: OpenACCCombinedConstruct{{.*}}serial loop
26+
// CHECK-NEXT: wait clause
27+
// CHECK-NEXT: <<<NULL>>>
28+
// CHECK-NEXT: ForStmt
29+
#pragma acc kernels loop wait(some_int(), some_long())
30+
for (int i = 0; i < 5; ++i) {}
31+
// CHECK: OpenACCCombinedConstruct{{.*}}kernels loop
32+
// CHECK-NEXT: wait clause
33+
// CHECK-NEXT: <<<NULL>>>
34+
// CHECK-NEXT: CallExpr{{.*}}'int'
35+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
36+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
37+
// CHECK-NEXT: CallExpr{{.*}}'long'
38+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
39+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
40+
// CHECK-NEXT: ForStmt
41+
#pragma acc parallel loop wait(queues:some_int(), some_long())
42+
for (int i = 0; i < 5; ++i) {}
43+
// CHECK: OpenACCCombinedConstruct{{.*}}parallel loop
44+
// CHECK-NEXT: wait clause has queues tag
45+
// CHECK-NEXT: <<<NULL>>>
46+
// CHECK-NEXT: CallExpr{{.*}}'int'
47+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
48+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
49+
// CHECK-NEXT: CallExpr{{.*}}'long'
50+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
51+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
52+
// CHECK-NEXT: ForStmt
53+
#pragma acc serial loop wait(devnum: some_int() :some_int(), some_long())
54+
for (int i = 0; i < 5; ++i) {}
55+
// CHECK: OpenACCCombinedConstruct{{.*}}serial loop
56+
// CHECK-NEXT: wait clause has devnum
57+
// CHECK-NEXT: CallExpr{{.*}}'int'
58+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
59+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
60+
// CHECK-NEXT: CallExpr{{.*}}'int'
61+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
62+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
63+
// CHECK-NEXT: CallExpr{{.*}}'long'
64+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
65+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
66+
// CHECK-NEXT: ForStmt
67+
#pragma acc kernels loop wait(devnum: some_int() : queues :some_int(), some_long()) wait(devnum: some_int() : queues :some_int(), some_long())
68+
for (int i = 0; i < 5; ++i) {}
69+
// CHECK: OpenACCCombinedConstruct{{.*}}kernels loop
70+
// CHECK-NEXT: wait clause has devnum has queues tag
71+
// CHECK-NEXT: CallExpr{{.*}}'int'
72+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
73+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
74+
// CHECK-NEXT: CallExpr{{.*}}'int'
75+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
76+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
77+
// CHECK-NEXT: CallExpr{{.*}}'long'
78+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
79+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
80+
// CHECK-NEXT: wait clause has devnum has queues tag
81+
// CHECK-NEXT: CallExpr{{.*}}'int'
82+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
83+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
84+
// CHECK-NEXT: CallExpr{{.*}}'int'
85+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
86+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
87+
// CHECK-NEXT: CallExpr{{.*}}'long'
88+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
89+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
90+
// CHECK-NEXT: ForStmt
91+
}
92+
93+
template<typename U>
94+
void TemplUses(U u) {
95+
// CHECK: FunctionTemplateDecl
96+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 U
97+
// CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (U)'
98+
// CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
99+
// CHECK-NEXT: CompoundStmt
100+
101+
#pragma acc parallel loop wait
102+
for (int i = 0; i < 5; ++i) {}
103+
// CHECK: OpenACCCombinedConstruct{{.*}}parallel loop
104+
// CHECK-NEXT: wait clause
105+
// CHECK-NEXT: <<<NULL>>>
106+
// CHECK-NEXT: ForStmt
107+
108+
#pragma acc serial loop wait()
109+
for (int i = 0; i < 5; ++i) {}
110+
// CHECK: OpenACCCombinedConstruct{{.*}}serial loop
111+
// CHECK-NEXT: wait clause
112+
// CHECK-NEXT: <<<NULL>>>
113+
// CHECK-NEXT: ForStmt
114+
115+
#pragma acc kernels loop wait(U::value, u)
116+
for (int i = 0; i < 5; ++i) {}
117+
// CHECK: OpenACCCombinedConstruct{{.*}}kernels loop
118+
// CHECK-NEXT: wait clause
119+
// CHECK-NEXT: <<<NULL>>>
120+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
121+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
122+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
123+
// CHECK-NEXT: ForStmt
124+
125+
#pragma acc parallel loop wait(queues: U::value, u)
126+
for (int i = 0; i < 5; ++i) {}
127+
// CHECK: OpenACCCombinedConstruct{{.*}}parallel loop
128+
// CHECK-NEXT: wait clause has queues tag
129+
// CHECK-NEXT: <<<NULL>>>
130+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
131+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
132+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
133+
// CHECK-NEXT: ForStmt
134+
135+
#pragma acc serial loop wait(devnum:u:queues: U::value, u)
136+
for (int i = 0; i < 5; ++i) {}
137+
// CHECK: OpenACCCombinedConstruct{{.*}}serial loop
138+
// CHECK-NEXT: wait clause has devnum has queues tag
139+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
140+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
141+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
142+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
143+
// CHECK-NEXT: ForStmt
144+
145+
#pragma acc kernels loop wait(devnum:u: U::value, u)
146+
for (int i = 0; i < 5; ++i) {}
147+
// CHECK: OpenACCCombinedConstruct{{.*}}kernels loop
148+
// CHECK-NEXT: wait clause has devnum
149+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
150+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
151+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
152+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
153+
// CHECK-NEXT: ForStmt
154+
155+
// Check the instantiated versions of the above.
156+
// CHECK: FunctionDecl{{.*}} used TemplUses 'void (HasInt)' implicit_instantiation
157+
// CHECK-NEXT: TemplateArgument type 'HasInt'
158+
// CHECK-NEXT: RecordType{{.*}} 'HasInt'
159+
// CHECK-NEXT: CXXRecord{{.*}} 'HasInt'
160+
// CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'
161+
// CHECK-NEXT: CompoundStmt
162+
163+
// CHECK: OpenACCCombinedConstruct{{.*}}parallel loop
164+
// CHECK-NEXT: wait clause
165+
// CHECK-NEXT: <<<NULL>>>
166+
// CHECK-NEXT: ForStmt
167+
168+
// CHECK: OpenACCCombinedConstruct{{.*}}serial loop
169+
// CHECK-NEXT: wait clause
170+
// CHECK-NEXT: <<<NULL>>>
171+
// CHECK-NEXT: ForStmt
172+
173+
// CHECK: OpenACCCombinedConstruct{{.*}}kernels loop
174+
// CHECK-NEXT: wait clause
175+
// CHECK-NEXT: <<<NULL>>>
176+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
177+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
178+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
179+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
180+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
181+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
182+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
183+
// CHECK-NEXT: ForStmt
184+
185+
// CHECK: OpenACCCombinedConstruct{{.*}}parallel loop
186+
// CHECK-NEXT: wait clause has queues tag
187+
// CHECK-NEXT: <<<NULL>>>
188+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
189+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
190+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
191+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
192+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
193+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
194+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
195+
// CHECK-NEXT: ForStmt
196+
197+
// CHECK: OpenACCCombinedConstruct{{.*}}serial loop
198+
// CHECK-NEXT: wait clause has devnum has queues tag
199+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
200+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
201+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
202+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
203+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
204+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
205+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
206+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
207+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
208+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
209+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
210+
// CHECK-NEXT: ForStmt
211+
212+
// CHECK: OpenACCCombinedConstruct{{.*}}kernels loop
213+
// CHECK-NEXT: wait clause has devnum
214+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
215+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
216+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
217+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
218+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
219+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
220+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
221+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
222+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
223+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
224+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
225+
// CHECK-NEXT: ForStmt
226+
}
227+
228+
struct HasInt {
229+
using IntTy = int;
230+
using ShortTy = short;
231+
static constexpr int value = 1;
232+
233+
operator char();
234+
};
235+
236+
void Inst() {
237+
TemplUses<HasInt>({});
238+
}
239+
#endif
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
struct NotConvertible{} NC;
4+
short getS();
5+
int getI();
6+
7+
void uses() {
8+
int arr[5];
9+
10+
#pragma acc parallel loop wait
11+
for (unsigned i = 0; i < 5; ++i);
12+
13+
#pragma acc serial loop wait()
14+
for (unsigned i = 0; i < 5; ++i);
15+
16+
#pragma acc kernels loop wait(getS(), getI())
17+
for (unsigned i = 0; i < 5; ++i);
18+
19+
#pragma acc parallel loop wait(devnum:getS(): getI())
20+
for (unsigned i = 0; i < 5; ++i);
21+
22+
#pragma acc parallel loop wait(devnum:getS(): queues: getI()) wait(devnum:getI(): queues: getS(), getI(), 5)
23+
for (unsigned i = 0; i < 5; ++i);
24+
25+
// expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
26+
#pragma acc parallel loop wait(devnum:NC : 5)
27+
for (unsigned i = 0; i < 5; ++i);
28+
29+
// expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
30+
#pragma acc parallel loop wait(devnum:5 : NC)
31+
for (unsigned i = 0; i < 5; ++i);
32+
33+
// expected-error@+3{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}
34+
// expected-error@+2{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}
35+
// expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
36+
#pragma acc parallel loop wait(devnum:arr : queues: arr, NC, 5)
37+
for (unsigned i = 0; i < 5; ++i);
38+
39+
// expected-error@+1{{OpenACC 'wait' clause is not valid on 'loop' directive}}
40+
#pragma acc loop wait
41+
for(int i = 5; i < 10;++i);
42+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
struct ExplicitConvertOnly {
4+
explicit operator int() const; // #EXPL_CONV
5+
} Explicit;
6+
7+
struct AmbiguousConvert{
8+
operator int(); // #AMBIG_INT
9+
operator short(); // #AMBIG_SHORT
10+
operator float();
11+
} Ambiguous;
12+
13+
void Test() {
14+
15+
// expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}}
16+
// expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
17+
// expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
18+
#pragma acc parallel loop wait(Ambiguous)
19+
for (unsigned i = 0; i < 5; ++i);
20+
21+
// expected-error@+2{{OpenACC integer expression type 'struct ExplicitConvertOnly' requires explicit conversion to 'int'}}
22+
// expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
23+
#pragma acc parallel loop wait(4, Explicit, 5)
24+
for (unsigned i = 0; i < 5; ++i);
25+
26+
// expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}}
27+
// expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
28+
// expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
29+
#pragma acc parallel loop wait(queues: Ambiguous, 5)
30+
for (unsigned i = 0; i < 5; ++i);
31+
32+
// expected-error@+2{{OpenACC integer expression type 'struct ExplicitConvertOnly' requires explicit conversion to 'int'}}
33+
// expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
34+
#pragma acc parallel loop wait(devnum: Explicit: 5)
35+
for (unsigned i = 0; i < 5; ++i);
36+
37+
// expected-error@+2{{OpenACC integer expression type 'struct ExplicitConvertOnly' requires explicit conversion to 'int'}}
38+
// expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
39+
#pragma acc parallel loop wait(devnum: Explicit:queues: 5)
40+
for (unsigned i = 0; i < 5; ++i);
41+
42+
// expected-error@+1{{use of undeclared identifier 'queues'}}
43+
#pragma acc parallel loop wait(devnum: queues: 5)
44+
for (unsigned i = 0; i < 5; ++i);
45+
}
46+
47+
struct HasInt {
48+
using IntTy = int;
49+
using ShortTy = short;
50+
static constexpr int value = 1;
51+
static constexpr AmbiguousConvert ACValue;
52+
static constexpr ExplicitConvertOnly EXValue;
53+
54+
operator char();
55+
};
56+
57+
template<typename T>
58+
void TestInst() {
59+
60+
#pragma acc parallel loop wait(T{})
61+
for (unsigned i = 0; i < 5; ++i);
62+
63+
#pragma acc parallel loop wait(devnum:typename T::ShortTy{}:queues:typename T::IntTy{})
64+
for (unsigned i = 0; i < 5; ++i);
65+
66+
// expected-error@+4{{multiple conversions from expression type 'const AmbiguousConvert' to an integral type}}
67+
// expected-note@#INST{{in instantiation of function template specialization}}
68+
// expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
69+
// expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
70+
#pragma acc parallel loop wait(devnum:T::value :queues:T::ACValue)
71+
for (unsigned i = 0; i < 5; ++i);
72+
73+
// expected-error@+5{{OpenACC integer expression type 'const ExplicitConvertOnly' requires explicit conversion to 'int'}}
74+
// expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
75+
// expected-error@+3{{multiple conversions from expression type 'const AmbiguousConvert' to an integral type}}
76+
// expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
77+
// expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
78+
#pragma acc parallel loop wait(devnum:T::EXValue :queues:T::ACValue)
79+
for (unsigned i = 0; i < 5; ++i);
80+
81+
// expected-error@+5{{OpenACC integer expression type 'const ExplicitConvertOnly' requires explicit conversion to 'int'}}
82+
// expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
83+
// expected-error@+3{{multiple conversions from expression type 'const AmbiguousConvert' to an integral type}}
84+
// expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
85+
// expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
86+
#pragma acc parallel loop wait(T::EXValue, T::ACValue)
87+
for (unsigned i = 0; i < 5; ++i);
88+
89+
// expected-error@+5{{OpenACC integer expression type 'const ExplicitConvertOnly' requires explicit conversion to 'int'}}
90+
// expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
91+
// expected-error@+3{{multiple conversions from expression type 'const AmbiguousConvert' to an integral type}}
92+
// expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
93+
// expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
94+
#pragma acc parallel loop wait(queues: T::EXValue, T::ACValue)
95+
for (unsigned i = 0; i < 5; ++i);
96+
97+
// expected-error@+1{{no member named 'Invalid' in 'HasInt'}}
98+
#pragma acc parallel loop wait(queues: T::Invalid, T::Invalid2)
99+
for (unsigned i = 0; i < 5; ++i);
100+
}
101+
102+
void Inst() {
103+
TestInst<HasInt>(); // #INST
104+
}

0 commit comments

Comments
 (0)