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()11 constexpr char const * f() { return s3; }
12 
13 using fn_p = char const * (*)();
14 template <fn_p> struct A { };
f2()15 constexpr fn_p f2() { return f; }
16 
17 struct B
18 {
BB19   constexpr B() { }
20   constexpr operator const char *() { return s3; }
21 };
22 
main()23 int 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 "" "" { 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 "" "" { target c++14_down } }
37 
38 
39   char const s8[] = "hi";
40   Message<s8> m8;  // { dg-error "" }
41 }
42