1 // RUN: %clang_cc1 -Wno-uninitialized -std=c++11 -verify %s
2 
3 template<int> struct c { c(int) = delete; typedef void val; operator int() const; };
4 
5 int f;
6 int val;
7 int foobar;
8 struct S {
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}}
20       , a > (e4);
21   int k11 = 0 < 1, c<3>::*ptr;
22   int k12 = e < 0, int a<b<c>::* >(), e11;
23 
24   void f1(
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'}}
31   );
32 
33   static void f1b(
34     int k6 = a < b, c < d > (f)
35   );
36   using f1b_T = decltype(f1b(0)); // only one parameter, because second param
37                                   // would be missing its default argument
38 
39   void f2a(
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'}}
42   );
43 
44   template<typename, int=0> struct T3 { T3(int); operator int(); };
45 
46   void f2b(
47     int k1 = c < b, T3 < int > x  = 0 // ok
48   );
49 
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;
55 
56   void f4(
57     int k1 = a<1,2>::val,
58     int missing_default // expected-error {{missing default argument on parameter}}
59   );
60 
61   void f5(
62     int k1 = b < c,
63     int missing_default // expected-error {{missing default argument on parameter}}
64   );
65 
66   // FIXME: We should ideally disambiguate this as two parameters.
67   void f6(
68     int k = b < c, // expected-error {{unexpected end of default argument}}
69     unsigned int (missing_default)
70   );
71 
72   template<int, int = 0> struct a { // expected-note {{here}}
73     a();
74     a(int);
75     static const int val = 0;
76     operator int();
77   };
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;
81 
82   int mp1 = 0 < 1,
83       a<b<c,b<c>::*mp2,
84       mp3 = 0 > a<b<c>::val,
85       a<b<c,b<c>::*mp4 = 0,
86       a<b<c,b<c>::*mp5 {0},
87       a<b<c,b<c>::*mp6;
88 
89   int np1 = e<0, int a<b<c,b<c>::*>();
90 
91   static const int T1 = 4;
92   template<int, int &(S::*)(int)> struct T2 { static const int val = 0; };
93 };
94 
95 namespace NoAnnotationTokens {
96   template<bool> struct Bool { Bool(int); };
97   static const bool in_class = false;
98 
99   struct Test {
100     // Check we don't keep around a Bool<false> annotation token here.
101     int f(Bool<true> = X<Y, Bool<in_class> >(0));
102 
103     // But it's OK if we do here.
104     int g(Bool<true> = Z<Y, Bool<in_class> = Bool<false>(0));
105 
106     static const bool in_class = true;
107     template<int, typename U> using X = U;
108     static const int Y = 0, Z = 0;
109   };
110 }
111 
112 namespace ImplicitInstantiation {
113   template<typename T> struct HasError { typename T::error error; }; // expected-error {{has no members}}
114 
115   struct S {
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}}
119 
120     template<typename, typename> struct X { operator int(); };
121     typedef int Y;
122     template<typename> struct HasError { typedef int Z; };
123   };
124 
125   HasError<int> hei;
126 }
127 
128 namespace CWG325 {
129   template <int A, typename B> struct T { static int i; operator int(); };
130   class C {
131     int Foo (int i = T<1, int>::i);
132   };
133 
134   class D {
135     int Foo (int i = T<1, int>::i);
136     template <int A, typename B> struct T {static int i;};
137   };
138 
139   const int a = 0;
140   typedef int b;
141   T<a,b> c;
142   struct E {
143     int n = T<a,b>(c);
144   };
145 }
146 
147 namespace Operators {
148   struct Y {};
operator ,(const Y &,const Y &)149   constexpr int operator,(const Y&, const Y&) { return 8; }
operator >(const Y &,const Y &)150   constexpr int operator>(const Y&, const Y&) { return 8; }
operator <(const Y &,const Y &)151   constexpr int operator<(const Y&, const Y&) { return 8; }
operator >>(const Y &,const Y &)152   constexpr int operator>>(const Y&, const Y&) { return 8; }
153 
154   struct X {
155     typedef int (*Fn)(const Y&, const Y&);
156 
157     Fn a = operator,, b = operator<, c = operator>;
158     void f(Fn a = operator,, Fn b = operator<, Fn c = operator>);
159 
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;
166 
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 {};
171   };
172 }
173 
174 namespace ElaboratedTypeSpecifiers {
175   struct S {
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;
182     enum E {};
183   };
184 }
185 
186 namespace PR20459 {
187   template <typename EncTraits> struct A {
188      void foo(int = EncTraits::template TypeEnc<int, int>::val); // ok
189   };
190 }
191