1 // RUN: %clang_cc1 -Wno-uninitialized -std=c++11 -verify %s
3 template<int> struct c
{ c(int) = delete; typedef void val
; operator int() const; };
9 int k1
= a
< b
< c
, d
> ::val
, e1
;
10 int k2
= a
< b
, c
< d
> ::val
, e2
;
11 int k3
= b
< a
< c
, d
> ::val
, e3
;
12 int k4
= b
< c
, x
, y
= d
> ::val
, e4
;
13 int k5
= T1
< b
, &S::operator=(int); // expected-error {{extra qualification}}
14 int k6
= T2
< b
, &S::operator= >::val
;
15 int k7
= T1
< b
, &S::operator>(int); // expected-error {{extra qualification}}
16 int k8
= T2
< b
, &S::operator> >::val
;
17 int k9
= T3
< a
< b
, c
>> (d
), e5
= 1 > (e4
);
18 int k10
= 0 < T3
< a
< b
, c
>> (d
19 ) // expected-error {{expected ';' at end of declaration}}
21 int k11
= 0 < 1, c
<3>::*ptr
;
22 int k12
= e
< 0, int a
<b
<c
>::* >(), e11
;
25 int k1
= a
< b
< c
, d
> ::val
,
26 int k2
= b
< a
< c
, d
> ::val
,
27 int k3
= b
< c
, int x
= 0 > ::val
,
28 int k4
= a
< b
, T3
< int > >(), // expected-error {{must be an expression}}
29 int k5
= a
< b
, c
< d
> ::val
,
30 int k6
= a
< b
, c
< d
> (n
) // expected-error {{undeclared identifier 'n'}}
34 int k6
= a
< b
, c
< d
> (f
)
36 using f1b_T
= decltype(f1b(0)); // only one parameter, because second param
37 // would be missing its default argument
40 // T3<int> here is a parameter type, so must be declared before it is used.
41 int k1
= c
< b
, T3
< int > x
= 0 // expected-error {{no template named 'T3'}}
44 template<typename
, int=0> struct T3
{ T3(int); operator int(); };
47 int k1
= c
< b
, T3
< int > x
= 0 // ok
50 // This is a one-parameter function. Ensure we don't typo-correct it to
51 // int = a < b, c < foobar > ()
52 // ... which would be a function with two parameters.
53 int f3(int = a
< b
, c
< goobar
> ());
54 static constexpr int (S::*f3_test
)(int) = &S::f3
;
58 int missing_default
// expected-error {{missing default argument on parameter}}
63 int missing_default
// expected-error {{missing default argument on parameter}}
66 // FIXME: We should ideally disambiguate this as two parameters.
68 int k
= b
< c
, // expected-error {{unexpected end of default argument}}
69 unsigned int (missing_default
)
72 template<int, int = 0> struct a
{ // expected-note {{here}}
75 static const int val
= 0;
78 static const int b
= 0, c
= 1, d
= 2, goobar
= 3;
79 template<int, typename
> struct e
{ operator int(); };
80 static const int f
= 0;
84 mp3
= 0 > a
<b
<c
>::val
,
89 int np1
= e
<0, int a
<b
<c
,b
<c
>::*>();
91 static const int T1
= 4;
92 template<int, int &(S::*)(int)> struct T2
{ static const int val
= 0; };
95 namespace NoAnnotationTokens
{
96 template<bool> struct Bool
{ Bool(int); };
97 static const bool in_class
= false;
100 // Check we don't keep around a Bool<false> annotation token here.
101 int f(Bool
<true> = X
<Y
, Bool
<in_class
> >(0));
103 // But it's OK if we do here.
104 int g(Bool
<true> = Z
<Y
, Bool
<in_class
> = Bool
<false>(0));
106 static const bool in_class
= true;
107 template<int, typename U
> using X
= U
;
108 static const int Y
= 0, Z
= 0;
112 namespace ImplicitInstantiation
{
113 template<typename T
> struct HasError
{ typename
T::error error
; }; // expected-error {{has no members}}
116 // This triggers the instantiation of the outer HasError<int> during
117 // disambiguation, even though it uses the inner HasError<int>.
118 void f(int a
= X
<Y
, HasError
<int>::Z
>()); // expected-note {{in instantiation of}}
120 template<typename
, typename
> struct X
{ operator int(); };
122 template<typename
> struct HasError
{ typedef int Z
; };
129 template <int A
, typename B
> struct T
{ static int i
; operator int(); };
131 int Foo (int i
= T
<1, int>::i
);
135 int Foo (int i
= T
<1, int>::i
);
136 template <int A
, typename B
> struct T
{static int i
;};
147 namespace Operators
{
149 constexpr int operator,(const Y
&, const Y
&) { return 8; }
150 constexpr int operator>(const Y
&, const Y
&) { return 8; }
151 constexpr int operator<(const Y
&, const Y
&) { return 8; }
152 constexpr int operator>>(const Y
&, const Y
&) { return 8; }
155 typedef int (*Fn
)(const Y
&, const Y
&);
157 Fn a
= operator,, b
= operator<, c
= operator>;
158 void f(Fn a
= operator,, Fn b
= operator<, Fn c
= operator>);
160 int k1
= T1
<0, operator<, operator>, operator<>::val
, l1
;
161 int k2
= T1
<0, operator>, operator,, operator,>::val
, l2
;
162 int k3
= T2
<0, operator,(Y
{}, Y
{}), operator<(Y
{}, Y
{})>::val
, l3
;
163 int k4
= T2
<0, operator>(Y
{}, Y
{}), operator,(Y
{}, Y
{})>::val
, l4
;
164 int k5
= T3
<0, operator>>>::val
, l5
;
165 int k6
= T4
<0, T3
<0, operator>>>>::val
, l6
;
167 template<int, Fn
, Fn
, Fn
> struct T1
{ enum { val
}; };
168 template<int, int, int> struct T2
{ enum { val
}; };
169 template<int, Fn
> struct T3
{ enum { val
}; };
170 template<int, typename T
> struct T4
: T
{};
174 namespace ElaboratedTypeSpecifiers
{
176 int f(int x
= T
<a
, struct S
>());
177 int h(int x
= T
<a
, union __attribute__(()) U
>());
178 int i(int x
= T
<a
, enum E
>());
179 int j(int x
= T
<a
, struct S::template T
<0, enum E
>>());
180 template <int, typename
> struct T
{ operator int(); };
181 static const int a
= 0;
187 template <typename EncTraits
> struct A
{
188 void foo(int = EncTraits::template TypeEnc
<int, int>::val
); // ok