xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-async-clause.cpp (revision 4bbdb018a6cb564783cfb9c65ca82b81c6006bb6)
130cfe2b2Serichkeane // RUN: %clang_cc1 %s -fopenacc -verify
230cfe2b2Serichkeane 
330cfe2b2Serichkeane struct NotConvertible{} NC;
430cfe2b2Serichkeane struct Incomplete *SomeIncomplete; // #INCOMPLETE
530cfe2b2Serichkeane enum E{} SomeE;
630cfe2b2Serichkeane enum class E2{} SomeE2;
730cfe2b2Serichkeane 
830cfe2b2Serichkeane struct CorrectConvert {
930cfe2b2Serichkeane   operator int();
1030cfe2b2Serichkeane } Convert;
1130cfe2b2Serichkeane 
1230cfe2b2Serichkeane struct ExplicitConvertOnly {
1330cfe2b2Serichkeane   explicit operator int() const; // #EXPL_CONV
1430cfe2b2Serichkeane } Explicit;
1530cfe2b2Serichkeane 
1630cfe2b2Serichkeane struct AmbiguousConvert{
1730cfe2b2Serichkeane   operator int(); // #AMBIG_INT
1830cfe2b2Serichkeane   operator short(); // #AMBIG_SHORT
1930cfe2b2Serichkeane   operator float();
2030cfe2b2Serichkeane } Ambiguous;
2130cfe2b2Serichkeane 
2230cfe2b2Serichkeane void Test() {
2330cfe2b2Serichkeane #pragma acc parallel async
2430cfe2b2Serichkeane   while(1);
2530cfe2b2Serichkeane #pragma acc parallel async(1)
2630cfe2b2Serichkeane   while(1);
2730cfe2b2Serichkeane #pragma acc kernels async(-51)
2830cfe2b2Serichkeane   while(1);
2930cfe2b2Serichkeane 
3030cfe2b2Serichkeane   // expected-error@+1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid}}
3130cfe2b2Serichkeane #pragma acc parallel async(NC)
3230cfe2b2Serichkeane   while(1);
3330cfe2b2Serichkeane 
3430cfe2b2Serichkeane   // expected-error@+2{{OpenACC integer expression has incomplete class type 'struct Incomplete'}}
3530cfe2b2Serichkeane   // expected-note@#INCOMPLETE{{forward declaration of 'Incomplete'}}
3630cfe2b2Serichkeane #pragma acc kernels async(*SomeIncomplete)
3730cfe2b2Serichkeane   while(1);
3830cfe2b2Serichkeane 
3930cfe2b2Serichkeane #pragma acc parallel async(SomeE)
4030cfe2b2Serichkeane   while(1);
4130cfe2b2Serichkeane 
4230cfe2b2Serichkeane   // expected-error@+1{{OpenACC clause 'async' requires expression of integer type ('enum E2' invalid}}
4330cfe2b2Serichkeane #pragma acc kernels async(SomeE2)
4430cfe2b2Serichkeane   while(1);
4530cfe2b2Serichkeane 
4630cfe2b2Serichkeane #pragma acc parallel async(Convert)
4730cfe2b2Serichkeane   while(1);
4830cfe2b2Serichkeane 
49*4bbdb018Serichkeane   // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
5030cfe2b2Serichkeane   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
5130cfe2b2Serichkeane #pragma acc kernels async(Explicit)
5230cfe2b2Serichkeane   while(1);
5330cfe2b2Serichkeane 
5430cfe2b2Serichkeane   // expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}}
5530cfe2b2Serichkeane   // expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
5630cfe2b2Serichkeane   // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
5730cfe2b2Serichkeane #pragma acc parallel async(Ambiguous)
5830cfe2b2Serichkeane   while(1);
5930cfe2b2Serichkeane }
6030cfe2b2Serichkeane 
6130cfe2b2Serichkeane struct HasInt {
6230cfe2b2Serichkeane   using IntTy = int;
6330cfe2b2Serichkeane   using ShortTy = short;
6430cfe2b2Serichkeane   static constexpr int value = 1;
6530cfe2b2Serichkeane   static constexpr AmbiguousConvert ACValue;
6630cfe2b2Serichkeane   static constexpr ExplicitConvertOnly EXValue;
6730cfe2b2Serichkeane 
6830cfe2b2Serichkeane   operator char();
6930cfe2b2Serichkeane };
7030cfe2b2Serichkeane 
7130cfe2b2Serichkeane template<typename T>
7230cfe2b2Serichkeane void TestInst() {
7330cfe2b2Serichkeane 
7430cfe2b2Serichkeane   // expected-error@+1{{no member named 'Invalid' in 'HasInt'}}
7530cfe2b2Serichkeane #pragma acc parallel async(HasInt::Invalid)
7630cfe2b2Serichkeane   while (1);
7730cfe2b2Serichkeane 
7830cfe2b2Serichkeane   // expected-error@+2{{no member named 'Invalid' in 'HasInt'}}
7930cfe2b2Serichkeane   // expected-note@#INST{{in instantiation of function template specialization 'TestInst<HasInt>' requested here}}
8030cfe2b2Serichkeane #pragma acc kernels async(T::Invalid)
8130cfe2b2Serichkeane   while (1);
8230cfe2b2Serichkeane 
8330cfe2b2Serichkeane   // expected-error@+3{{multiple conversions from expression type 'const AmbiguousConvert' to an integral type}}
8430cfe2b2Serichkeane   // expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
8530cfe2b2Serichkeane   // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
8630cfe2b2Serichkeane #pragma acc parallel async(HasInt::ACValue)
8730cfe2b2Serichkeane   while (1);
8830cfe2b2Serichkeane 
8930cfe2b2Serichkeane   // expected-error@+3{{multiple conversions from expression type 'const AmbiguousConvert' to an integral type}}
9030cfe2b2Serichkeane   // expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
9130cfe2b2Serichkeane   // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
9230cfe2b2Serichkeane #pragma acc kernels async(T::ACValue)
9330cfe2b2Serichkeane   while (1);
9430cfe2b2Serichkeane 
95*4bbdb018Serichkeane   // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'const ExplicitConvertOnly' to 'int'}}
9630cfe2b2Serichkeane   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
9730cfe2b2Serichkeane #pragma acc parallel async(HasInt::EXValue)
9830cfe2b2Serichkeane   while (1);
9930cfe2b2Serichkeane 
100*4bbdb018Serichkeane   // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'const ExplicitConvertOnly' to 'int'}}
10130cfe2b2Serichkeane   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
10230cfe2b2Serichkeane #pragma acc kernels async(T::EXValue)
10330cfe2b2Serichkeane   while (1);
10430cfe2b2Serichkeane 
10530cfe2b2Serichkeane #pragma acc parallel async(HasInt::value)
10630cfe2b2Serichkeane   while (1);
10730cfe2b2Serichkeane 
10830cfe2b2Serichkeane #pragma acc kernels async(T::value)
10930cfe2b2Serichkeane   while (1);
11030cfe2b2Serichkeane 
11130cfe2b2Serichkeane #pragma acc parallel async(HasInt::IntTy{})
11230cfe2b2Serichkeane   while (1);
11330cfe2b2Serichkeane 
11430cfe2b2Serichkeane #pragma acc kernels async(typename T::ShortTy{})
11530cfe2b2Serichkeane   while (1);
11630cfe2b2Serichkeane 
11730cfe2b2Serichkeane #pragma acc parallel async(HasInt::IntTy{})
11830cfe2b2Serichkeane   while (1);
11930cfe2b2Serichkeane 
12030cfe2b2Serichkeane #pragma acc kernels async(typename T::ShortTy{})
12130cfe2b2Serichkeane   while (1);
12230cfe2b2Serichkeane 
12330cfe2b2Serichkeane   HasInt HI{};
12430cfe2b2Serichkeane   T MyT{};
12530cfe2b2Serichkeane 
12630cfe2b2Serichkeane #pragma acc parallel async(HI)
12730cfe2b2Serichkeane   while (1);
12830cfe2b2Serichkeane 
12930cfe2b2Serichkeane #pragma acc kernels async(MyT)
13030cfe2b2Serichkeane   while (1);
13130cfe2b2Serichkeane }
13230cfe2b2Serichkeane 
13330cfe2b2Serichkeane void Inst() {
13430cfe2b2Serichkeane   TestInst<HasInt>(); // #INST
13530cfe2b2Serichkeane }
136