// RUN: %clang_cc1 %s -fopenacc -verify struct NotConvertible{} NC; short getS(); int getI(); struct AmbiguousConvert{ operator int(); // #AMBIG_INT operator short(); // #AMBIG_SHORT operator float(); } Ambiguous; struct ExplicitConvertOnly { explicit operator int() const; // #EXPL_CONV } Explicit; void uses() { #pragma acc shutdown #pragma acc shutdown if (getI() < getS()) #pragma acc shutdown device_num(getI()) #pragma acc shutdown device_type(host) device_num(getI()) #pragma acc shutdown device_type(nvidia) if (getI() < getS()) #pragma acc shutdown device_type(radeon) device_num(getI()) if (getI() < getS()) // expected-error@+1{{value of type 'struct NotConvertible' is not contextually convertible to 'bool'}} #pragma acc shutdown if (NC) // expected-error@+1{{OpenACC clause 'device_num' requires expression of integer type ('struct NotConvertible' invalid)}} #pragma acc shutdown device_num(NC) // expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}} // expected-note@#AMBIG_INT{{conversion to integral type 'int'}} // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}} #pragma acc shutdown device_num(Ambiguous) // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}} // expected-note@#EXPL_CONV{{conversion to integral type 'int'}} #pragma acc shutdown device_num(Explicit) } template void TestInst() { T t; #pragma acc shutdown #pragma acc shutdown if (T::value < T{}) #pragma acc shutdown device_type(multicore) device_num(getI()) if (getI() < getS()) // expected-error@+2{{OpenACC 'device_num' clause cannot appear more than once on a 'shutdown' directive}} // expected-note@+1{{previous 'device_num' clause is here}} #pragma acc shutdown device_type(default) device_type(radeon) device_num(t) if (t < T::value) device_num(getI()) // expected-error@+1{{value of type 'const NotConvertible' is not contextually convertible to 'bool'}} #pragma acc shutdown if (T::NCValue) // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'shutdown' directive}} // expected-note@+1{{previous 'if' clause is here}} #pragma acc shutdown if(t < T::value) if (getI() < getS()) // expected-error@+1{{OpenACC clause 'device_num' requires expression of integer type ('const NotConvertible' invalid)}} #pragma acc shutdown device_num(T::NCValue) // expected-error@+3{{multiple conversions from expression type 'const AmbiguousConvert' to an integral type}} // expected-note@#AMBIG_INT{{conversion to integral type 'int'}} // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}} #pragma acc shutdown device_num(T::ACValue) // expected-error@+2{{OpenACC integer expression requires explicit conversion from 'const ExplicitConvertOnly' to 'int'}} // expected-note@#EXPL_CONV{{conversion to integral type 'int'}} #pragma acc shutdown device_num(T::EXValue) } struct HasStuff { static constexpr AmbiguousConvert ACValue; static constexpr ExplicitConvertOnly EXValue; static constexpr NotConvertible NCValue; static constexpr unsigned value = 5; operator char(); }; void Inst() { TestInst(); // expected-note {{in instantiation of function template specialization}} }