1 // RUN: %clang_cc1 -fsyntax-only -std=c++17 -verify %s -fcxx-exceptions
10 template<> void X0
<char>::f0(char);
11 template<> void X0
<char>::f1(type
);
14 template<typename _CharT
>
15 class numpunct
: public locale::facet
// expected-error{{use of undeclared identifier 'locale'}} \
16 // expected-error{{expected class name}}
18 static locale::id id
; // expected-error{{use of undeclared identifier}}
20 numpunct
<char>::~numpunct();
24 template<typename T
> struct S
{
25 struct U
{ static const int n
= 5; };
26 enum E
{ e
= U::n
}; // expected-note {{implicit instantiation first required here}}
29 template<> struct S
<int>::U
{ static const int n
= sizeof(int); }; // expected-error {{explicit specialization of 'U' after instantiation}}
36 template<int N
> void bar();
45 void Baz
<T
>::bar
<0>() { // expected-error {{cannot specialize a member of an unspecialized template}}
50 template<typename T
> struct Helper
{
51 template<int N
> static void func(const T
*m
) {}
54 template<typename T
> void Helper
<T
>::func
<2>() {} // expected-error {{cannot specialize a member}}
58 template <typename T
> struct A
{
59 static int n
; // expected-note {{previous}}
60 static void f(); // expected-note {{previous}}
62 template<> float A
<int>::n
; // expected-error {{different type}}
63 template<> void A
<int>::f() throw(); // expected-error {{does not match}}
67 template<int N
> struct Outer
{
68 template<typename
...> struct Inner
;
69 template<> struct Inner
<> {
70 static constexpr int f() { return N
; }
73 template<typename
...> static int a
;
74 template<> static constexpr int a
<> = N
;
76 template<typename
...> static inline int b
;
77 template<> static inline constexpr int b
<> = N
;
79 template<typename
...> static constexpr int f();
80 template<> static constexpr int f() {
84 static_assert(Outer
<123>::Inner
<>::f() == 123, "");
85 static_assert(Outer
<123>::Inner
<>::f() != 125, "");
87 static_assert(Outer
<123>::a
<> == 123, "");
88 static_assert(Outer
<123>::a
<> != 125, "");
90 static_assert(Outer
<123>::b
<> == 123, "");
91 static_assert(Outer
<123>::b
<> != 125, "");
93 static_assert(Outer
<123>::f
<>() == 123, "");
94 static_assert(Outer
<123>::f
<>() != 125, "");