xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-wait-clause.cpp (revision 4bbdb018a6cb564783cfb9c65ca82b81c6006bb6)
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 wait(Ambiguous)
19   while (true);
20 
21   // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
22   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
23 #pragma acc parallel wait(4, Explicit, 5)
24   while (true);
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 wait(queues: Ambiguous, 5)
30   while (true);
31 
32   // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
33   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
34 #pragma acc parallel wait(devnum: Explicit: 5)
35   while (true);
36 
37   // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
38   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
39 #pragma acc parallel wait(devnum: Explicit:queues:  5)
40   while (true);
41 
42   // expected-error@+1{{use of undeclared identifier 'queues'}}
43 #pragma acc parallel wait(devnum: queues:  5)
44   while (true);
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 wait(T{})
61   while (true);
62 
63 #pragma acc parallel wait(devnum:typename T::ShortTy{}:queues:typename T::IntTy{})
64   while (true);
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 wait(devnum:T::value :queues:T::ACValue)
71   while (true);
72 
73   // expected-error@+5{{OpenACC integer expression requires explicit conversion from 'const ExplicitConvertOnly' 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 wait(devnum:T::EXValue :queues:T::ACValue)
79   while (true);
80 
81   // expected-error@+5{{OpenACC integer expression requires explicit conversion from 'const ExplicitConvertOnly' 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 wait(T::EXValue, T::ACValue)
87   while (true);
88 
89   // expected-error@+5{{OpenACC integer expression requires explicit conversion from 'const ExplicitConvertOnly' 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 wait(queues: T::EXValue, T::ACValue)
95   while (true);
96 
97   // expected-error@+1{{no member named 'Invalid' in 'HasInt'}}
98 #pragma acc parallel wait(queues: T::Invalid, T::Invalid2)
99   while (true);
100 }
101 
102 void Inst() {
103   TestInst<HasInt>(); // #INST
104 }
105