111
|
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
|
|
11 constexpr char const * f() { return s3; }
|
|
12
|
|
13 using fn_p = char const * (*)();
|
|
14 template <fn_p> struct A { };
|
|
15 constexpr fn_p f2() { return f; }
|
|
16
|
|
17 struct B
|
|
18 {
|
|
19 constexpr B() { }
|
|
20 constexpr operator const char *() { return s3; }
|
|
21 };
|
|
22
|
|
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
|
145
|
29 A<f2()> a1; // { dg-error "7:.f2\\(\\). is not a valid template argument" "" { target c++14_down } }
|
111
|
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 } }
|
145
|
36 Message<B{}> m7; // { dg-error "11:could not convert template argument" "" { target c++14_down } }
|
111
|
37
|
|
38
|
|
39 char const s8[] = "hi";
|
|
40 Message<s8> m8; // { dg-error "" }
|
|
41 }
|