1 // { dg-do compile { target c++11 } } 2 3 template <char const* STR> 4 class Message { 5 }; 6 7 extern char const s1[] = "hi"; 8 char const s2[] = "hi"; 9 constexpr char const s3[] = "hi"; // OK since C++11 10 f()11constexpr char const * f() { return s3; } 12 13 using fn_p = char const * (*)(); 14 template <fn_p> struct A { }; f2()15constexpr fn_p f2() { return f; } 16 17 struct B 18 { BB19 constexpr B() { } 20 constexpr operator const char *() { return s3; } 21 }; 22 main()23int main() 24 { 25 Message<s1> m1; // OK (all versions) 26 Message<s2> m2; // OK for clang since C++14, for gcc since C++17 27 Message<s3> m3; // OK for clang/gcc since C++11 28 29 A<f2()> a1; // { dg-error "7:.f2\\(\\). is not a valid template argument" "" { target c++14_down } } 30 31 static char const s4[] = "hi"; 32 static constexpr char const s5[] = "hi"; // OK since C++11 33 Message<s4> m4; // { dg-error "no linkage" "" { target c++14_down } } 34 Message<s5> m5; // { dg-error "no linkage" "" { target c++14_down } } 35 Message<f()> m6; // { dg-error "" "" { target c++14_down } } 36 Message<B{}> m7; // { dg-error "11:could not convert template argument" "" { target c++14_down } } 37 38 39 char const s8[] = "hi"; 40 Message<s8> m8; // { dg-error "" } 41 } 42