1dc20a0eaSErich Keane // RUN: %clang_cc1 %s -fopenacc -verify 2dc20a0eaSErich Keane 3dc20a0eaSErich Keane struct NotConvertible{} NC; 4dc20a0eaSErich Keane struct Incomplete *SomeIncomplete; // #INCOMPLETE 5dc20a0eaSErich Keane enum E{} SomeE; 6dc20a0eaSErich Keane enum class E2{} SomeE2; 7dc20a0eaSErich Keane 8dc20a0eaSErich Keane struct CorrectConvert { 9dc20a0eaSErich Keane operator int(); 10dc20a0eaSErich Keane } Convert; 11dc20a0eaSErich Keane 12dc20a0eaSErich Keane struct ExplicitConvertOnly { 13dc20a0eaSErich Keane explicit operator int() const; // #EXPL_CONV 14dc20a0eaSErich Keane } Explicit; 15dc20a0eaSErich Keane 16dc20a0eaSErich Keane struct AmbiguousConvert{ 17dc20a0eaSErich Keane operator int(); // #AMBIG_INT 18dc20a0eaSErich Keane operator short(); // #AMBIG_SHORT 19dc20a0eaSErich Keane operator float(); 20dc20a0eaSErich Keane } Ambiguous; 21dc20a0eaSErich Keane 22dc20a0eaSErich Keane short some_short(); 23dc20a0eaSErich Keane int some_int(); 24dc20a0eaSErich Keane long some_long(); 25dc20a0eaSErich Keane 26dc20a0eaSErich Keane void Test() { 27dc20a0eaSErich Keane #pragma acc kernels num_gangs(1) 28dc20a0eaSErich Keane while(1); 29dc20a0eaSErich Keane 30dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 31dc20a0eaSErich Keane #pragma acc serial num_gangs(1) 32dc20a0eaSErich Keane while(1); 33dc20a0eaSErich Keane 34dc20a0eaSErich Keane #pragma acc parallel num_gangs(1) 35dc20a0eaSErich Keane while(1); 36dc20a0eaSErich Keane 37dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 38dc20a0eaSErich Keane #pragma acc serial num_gangs(some_short(), some_int(), some_long()) 39dc20a0eaSErich Keane while(1); 40dc20a0eaSErich Keane 41dc20a0eaSErich Keane #pragma acc parallel num_gangs(some_short(), some_int(), some_long()) 42dc20a0eaSErich Keane while(1); 43dc20a0eaSErich Keane 44dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 45dc20a0eaSErich Keane #pragma acc serial num_gangs(some_short(), some_int(), some_long(), SomeE) 46dc20a0eaSErich Keane while(1); 47dc20a0eaSErich Keane 48dc20a0eaSErich Keane // expected-error@+1{{too many integer expression arguments provided to OpenACC 'num_gangs' clause: 'parallel' directive expects maximum of 3, 4 were provided}} 49dc20a0eaSErich Keane #pragma acc parallel num_gangs(some_short(), some_int(), some_long(), SomeE) 50dc20a0eaSErich Keane while(1); 51dc20a0eaSErich Keane 52dc20a0eaSErich Keane // expected-error@+1{{too many integer expression arguments provided to OpenACC 'num_gangs' clause: 'kernels' directive expects maximum of 1, 2 were provided}} 53dc20a0eaSErich Keane #pragma acc kernels num_gangs(1, 2) 54dc20a0eaSErich Keane while(1); 55dc20a0eaSErich Keane 56dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 57dc20a0eaSErich Keane #pragma acc serial num_gangs(1, 2) 58dc20a0eaSErich Keane while(1); 59dc20a0eaSErich Keane 60dc20a0eaSErich Keane #pragma acc parallel num_gangs(1, 2) 61dc20a0eaSErich Keane while(1); 62dc20a0eaSErich Keane 63dc20a0eaSErich Keane // expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}} 64dc20a0eaSErich Keane // expected-note@#AMBIG_INT{{conversion to integral type 'int'}} 65dc20a0eaSErich Keane // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}} 66dc20a0eaSErich Keane #pragma acc parallel num_gangs(Ambiguous) 67dc20a0eaSErich Keane while(1); 68dc20a0eaSErich Keane 69dc20a0eaSErich Keane // expected-error@+1{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}} 70dc20a0eaSErich Keane #pragma acc parallel num_gangs(NC, SomeE) 71dc20a0eaSErich Keane while(1); 72dc20a0eaSErich Keane 73dc20a0eaSErich Keane // expected-error@+1{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}} 74dc20a0eaSErich Keane #pragma acc parallel num_gangs(SomeE, NC) 75dc20a0eaSErich Keane while(1); 76dc20a0eaSErich Keane 77*4bbdb018Serichkeane // expected-error@+3{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}} 78dc20a0eaSErich Keane // expected-note@#EXPL_CONV{{conversion to integral type 'int'}} 79dc20a0eaSErich Keane // expected-error@+1{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}} 80dc20a0eaSErich Keane #pragma acc parallel num_gangs(Explicit, NC) 81dc20a0eaSErich Keane while(1); 82dc20a0eaSErich Keane 83*4bbdb018Serichkeane // expected-error@+4{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}} 84dc20a0eaSErich Keane // expected-note@#EXPL_CONV{{conversion to integral type 'int'}} 85dc20a0eaSErich Keane // expected-error@+2{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}} 86dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 87dc20a0eaSErich Keane #pragma acc serial num_gangs(Explicit, NC) 88dc20a0eaSErich Keane while(1); 89dc20a0eaSErich Keane 90*4bbdb018Serichkeane // expected-error@+6{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}} 91dc20a0eaSErich Keane // expected-note@#EXPL_CONV{{conversion to integral type 'int'}} 92dc20a0eaSErich Keane // expected-error@+4{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}} 93dc20a0eaSErich Keane // expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}} 94dc20a0eaSErich Keane // expected-note@#AMBIG_INT{{conversion to integral type 'int'}} 95dc20a0eaSErich Keane // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}} 96dc20a0eaSErich Keane #pragma acc parallel num_gangs(Explicit, NC, Ambiguous) 97dc20a0eaSErich Keane while(1); 98dc20a0eaSErich Keane 99*4bbdb018Serichkeane // expected-error@+7{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}} 100dc20a0eaSErich Keane // expected-note@#EXPL_CONV{{conversion to integral type 'int'}} 101dc20a0eaSErich Keane // expected-error@+5{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}} 102dc20a0eaSErich Keane // expected-error@+4{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}} 103dc20a0eaSErich Keane // expected-note@#AMBIG_INT{{conversion to integral type 'int'}} 104dc20a0eaSErich Keane // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}} 105dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 106dc20a0eaSErich Keane #pragma acc serial num_gangs(Explicit, NC, Ambiguous) 107dc20a0eaSErich Keane while(1); 108dc20a0eaSErich Keane } 109dc20a0eaSErich Keane 110dc20a0eaSErich Keane struct HasInt { 111dc20a0eaSErich Keane using IntTy = int; 112dc20a0eaSErich Keane using ShortTy = short; 113dc20a0eaSErich Keane static constexpr int value = 1; 114dc20a0eaSErich Keane static constexpr AmbiguousConvert ACValue; 115dc20a0eaSErich Keane static constexpr ExplicitConvertOnly EXValue; 116dc20a0eaSErich Keane 117dc20a0eaSErich Keane operator char(); 118dc20a0eaSErich Keane }; 119dc20a0eaSErich Keane 120dc20a0eaSErich Keane template <typename T> 121dc20a0eaSErich Keane void TestInst() { 122dc20a0eaSErich Keane // expected-error@+2{{no member named 'Invalid' in 'HasInt'}} 123dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 124dc20a0eaSErich Keane #pragma acc serial num_gangs(HasInt::Invalid) 125dc20a0eaSErich Keane while(1); 126dc20a0eaSErich Keane 127dc20a0eaSErich Keane // expected-error@+2{{no member named 'Invalid' in 'HasInt'}} 128dc20a0eaSErich Keane // expected-note@#INST{{in instantiation of function template specialization}} 129dc20a0eaSErich Keane #pragma acc parallel num_gangs(T::Invalid) 130dc20a0eaSErich Keane while(1); 131dc20a0eaSErich Keane 132dc20a0eaSErich Keane // expected-error@+1{{no member named 'Invalid' in 'HasInt'}} 133dc20a0eaSErich Keane #pragma acc parallel num_gangs(1, HasInt::Invalid) 134dc20a0eaSErich Keane while(1); 135dc20a0eaSErich Keane 136dc20a0eaSErich Keane // expected-error@+1{{no member named 'Invalid' in 'HasInt'}} 137dc20a0eaSErich Keane #pragma acc parallel num_gangs(T::Invalid, 1) 138dc20a0eaSErich Keane while(1); 139dc20a0eaSErich Keane 140dc20a0eaSErich Keane // expected-error@+2{{no member named 'Invalid' in 'HasInt'}} 141dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 142dc20a0eaSErich Keane #pragma acc serial num_gangs(1, HasInt::Invalid) 143dc20a0eaSErich Keane while(1); 144dc20a0eaSErich Keane 145dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 146dc20a0eaSErich Keane #pragma acc serial num_gangs(T::Invalid, 1) 147dc20a0eaSErich Keane while(1); 148dc20a0eaSErich Keane 149dc20a0eaSErich Keane #pragma acc parallel num_gangs(T::value, typename T::IntTy{}) 150dc20a0eaSErich Keane while(1); 151dc20a0eaSErich Keane 152dc20a0eaSErich Keane // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}} 153dc20a0eaSErich Keane #pragma acc serial num_gangs(T::value, typename T::IntTy{}) 154dc20a0eaSErich Keane while(1); 155dc20a0eaSErich Keane } 156dc20a0eaSErich Keane 157dc20a0eaSErich Keane void Inst() { 158dc20a0eaSErich Keane TestInst<HasInt>(); // #INST 159dc20a0eaSErich Keane } 160