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