1*67e74705SXin Li // RUN: %clang_cc1 -Wno-uninitialized -std=c++11 -verify %s 2*67e74705SXin Li 3*67e74705SXin Li template<int> struct c { c(int) = delete; typedef void val; operator int() const; }; 4*67e74705SXin Li 5*67e74705SXin Li int val; 6*67e74705SXin Li int foobar; 7*67e74705SXin Li struct S { 8*67e74705SXin Li int k1 = a < b < c, d > ::val, e1; 9*67e74705SXin Li int k2 = a < b, c < d > ::val, e2; 10*67e74705SXin Li int k3 = b < a < c, d > ::val, e3; 11*67e74705SXin Li int k4 = b < c, x, y = d > ::val, e4; 12*67e74705SXin Li int k5 = T1 < b, &S::operator=(int); // expected-error {{extra qualification}} 13*67e74705SXin Li int k6 = T2 < b, &S::operator= >::val; 14*67e74705SXin Li int k7 = T1 < b, &S::operator>(int); // expected-error {{extra qualification}} 15*67e74705SXin Li int k8 = T2 < b, &S::operator> >::val; 16*67e74705SXin Li int k9 = T3 < a < b, c >> (d), e5 = 1 > (e4); 17*67e74705SXin Li int k10 = 0 < T3 < a < b, c >> (d 18*67e74705SXin Li ) // expected-error {{expected ';' at end of declaration}} 19*67e74705SXin Li , a > (e4); 20*67e74705SXin Li int k11 = 0 < 1, c<3>::*ptr; 21*67e74705SXin Li int k12 = e < 0, int a<b<c>::* >(), e11; 22*67e74705SXin Li 23*67e74705SXin Li void f1( 24*67e74705SXin Li int k1 = a < b < c, d > ::val, 25*67e74705SXin Li int k2 = b < a < c, d > ::val, 26*67e74705SXin Li int k3 = b < c, int x = 0 > ::val, 27*67e74705SXin Li int k4 = a < b, T3 < int > >(), // expected-error {{must be an expression}} 28*67e74705SXin Li int k5 = a < b, c < d > ::val, 29*67e74705SXin Li int k6 = a < b, c < d > (n) // expected-error {{undeclared identifier 'n'}} 30*67e74705SXin Li ); 31*67e74705SXin Li 32*67e74705SXin Li void f2a( 33*67e74705SXin Li // T3<int> here is a parameter type, so must be declared before it is used. 34*67e74705SXin Li int k1 = c < b, T3 < int > x = 0 // expected-error {{unexpected end of default argument expression}} 35*67e74705SXin Li ); 36*67e74705SXin Li 37*67e74705SXin Li template<typename, int=0> struct T3 { T3(int); operator int(); }; 38*67e74705SXin Li 39*67e74705SXin Li void f2b( 40*67e74705SXin Li int k1 = c < b, T3 < int > x = 0 // ok 41*67e74705SXin Li ); 42*67e74705SXin Li 43*67e74705SXin Li // This is a one-parameter function. Ensure we don't typo-correct it to 44*67e74705SXin Li // int = a < b, c < foobar > () 45*67e74705SXin Li // ... which would be a function with two parameters. 46*67e74705SXin Li int f3(int = a < b, c < goobar > ()); 47*67e74705SXin Li static constexpr int (S::*f3_test)(int) = &S::f3; 48*67e74705SXin Li 49*67e74705SXin Li void f4( 50*67e74705SXin Li int k1 = a<1,2>::val, 51*67e74705SXin Li int missing_default // expected-error {{missing default argument on parameter}} 52*67e74705SXin Li ); 53*67e74705SXin Li 54*67e74705SXin Li void f5( 55*67e74705SXin Li int k1 = b < c, 56*67e74705SXin Li int missing_default // expected-error {{missing default argument on parameter}} 57*67e74705SXin Li ); 58*67e74705SXin Li 59*67e74705SXin Li void f6( 60*67e74705SXin Li int k = b < c, 61*67e74705SXin Li unsigned int (missing_default) // expected-error {{missing default argument on parameter}} 62*67e74705SXin Li ); 63*67e74705SXin Li 64*67e74705SXin Li template<int, int=0> struct a { static const int val = 0; operator int(); }; // expected-note {{here}} 65*67e74705SXin Li static const int b = 0, c = 1, d = 2, goobar = 3; 66*67e74705SXin Li template<int, typename> struct e { operator int(); }; 67*67e74705SXin Li 68*67e74705SXin Li int mp1 = 0 < 1, 69*67e74705SXin Li a<b<c,b<c>::*mp2, 70*67e74705SXin Li mp3 = 0 > a<b<c>::val, 71*67e74705SXin Li a<b<c,b<c>::*mp4 = 0, 72*67e74705SXin Li a<b<c,b<c>::*mp5 {0}, 73*67e74705SXin Li a<b<c,b<c>::*mp6; 74*67e74705SXin Li 75*67e74705SXin Li int np1 = e<0, int a<b<c,b<c>::*>(); 76*67e74705SXin Li 77*67e74705SXin Li static const int T1 = 4; 78*67e74705SXin Li template<int, int &(S::*)(int)> struct T2 { static const int val = 0; }; 79*67e74705SXin Li }; 80*67e74705SXin Li 81*67e74705SXin Li namespace NoAnnotationTokens { 82*67e74705SXin Li template<bool> struct Bool { Bool(int); }; 83*67e74705SXin Li static const bool in_class = false; 84*67e74705SXin Li 85*67e74705SXin Li struct Test { 86*67e74705SXin Li // Check we don't keep around a Bool<false> annotation token here. 87*67e74705SXin Li int f(Bool<true> = X<Y, Bool<in_class> >(0)); 88*67e74705SXin Li 89*67e74705SXin Li // But it's OK if we do here. 90*67e74705SXin Li int g(Bool<true> = Z<Y, Bool<in_class> = Bool<false>(0)); 91*67e74705SXin Li 92*67e74705SXin Li static const bool in_class = true; 93*67e74705SXin Li template<int, typename U> using X = U; 94*67e74705SXin Li static const int Y = 0, Z = 0; 95*67e74705SXin Li }; 96*67e74705SXin Li } 97*67e74705SXin Li 98*67e74705SXin Li namespace ImplicitInstantiation { 99*67e74705SXin Li template<typename T> struct HasError { typename T::error error; }; // expected-error {{has no members}} 100*67e74705SXin Li 101*67e74705SXin Li struct S { 102*67e74705SXin Li // This triggers the instantiation of the outer HasError<int> during 103*67e74705SXin Li // disambiguation, even though it uses the inner HasError<int>. 104*67e74705SXin Li void f(int a = X<Y, HasError<int>::Z >()); // expected-note {{in instantiation of}} 105*67e74705SXin Li 106*67e74705SXin Li template<typename, typename> struct X { operator int(); }; 107*67e74705SXin Li typedef int Y; 108*67e74705SXin Li template<typename> struct HasError { typedef int Z; }; 109*67e74705SXin Li }; 110*67e74705SXin Li 111*67e74705SXin Li HasError<int> hei; 112*67e74705SXin Li } 113*67e74705SXin Li 114*67e74705SXin Li namespace CWG325 { 115*67e74705SXin Li template <int A, typename B> struct T { static int i; operator int(); }; 116*67e74705SXin Li class C { 117*67e74705SXin Li int Foo (int i = T<1, int>::i); 118*67e74705SXin Li }; 119*67e74705SXin Li 120*67e74705SXin Li class D { 121*67e74705SXin Li int Foo (int i = T<1, int>::i); 122*67e74705SXin Li template <int A, typename B> struct T {static int i;}; 123*67e74705SXin Li }; 124*67e74705SXin Li 125*67e74705SXin Li const int a = 0; 126*67e74705SXin Li typedef int b; 127*67e74705SXin Li T<a,b> c; 128*67e74705SXin Li struct E { 129*67e74705SXin Li int n = T<a,b>(c); 130*67e74705SXin Li }; 131*67e74705SXin Li } 132*67e74705SXin Li 133*67e74705SXin Li namespace Operators { 134*67e74705SXin Li struct Y {}; operator ,(const Y &,const Y &)135*67e74705SXin Li constexpr int operator,(const Y&, const Y&) { return 8; } operator >(const Y &,const Y &)136*67e74705SXin Li constexpr int operator>(const Y&, const Y&) { return 8; } operator <(const Y &,const Y &)137*67e74705SXin Li constexpr int operator<(const Y&, const Y&) { return 8; } operator >>(const Y &,const Y &)138*67e74705SXin Li constexpr int operator>>(const Y&, const Y&) { return 8; } 139*67e74705SXin Li 140*67e74705SXin Li struct X { 141*67e74705SXin Li typedef int (*Fn)(const Y&, const Y&); 142*67e74705SXin Li 143*67e74705SXin Li Fn a = operator,, b = operator<, c = operator>; 144*67e74705SXin Li void f(Fn a = operator,, Fn b = operator<, Fn c = operator>); 145*67e74705SXin Li 146*67e74705SXin Li int k1 = T1<0, operator<, operator>, operator<>::val, l1; 147*67e74705SXin Li int k2 = T1<0, operator>, operator,, operator,>::val, l2; 148*67e74705SXin Li int k3 = T2<0, operator,(Y{}, Y{}), operator<(Y{}, Y{})>::val, l3; 149*67e74705SXin Li int k4 = T2<0, operator>(Y{}, Y{}), operator,(Y{}, Y{})>::val, l4; 150*67e74705SXin Li int k5 = T3<0, operator>>>::val, l5; 151*67e74705SXin Li int k6 = T4<0, T3<0, operator>>>>::val, l6; 152*67e74705SXin Li 153*67e74705SXin Li template<int, Fn, Fn, Fn> struct T1 { enum { val }; }; 154*67e74705SXin Li template<int, int, int> struct T2 { enum { val }; }; 155*67e74705SXin Li template<int, Fn> struct T3 { enum { val }; }; 156*67e74705SXin Li template<int, typename T> struct T4 : T {}; 157*67e74705SXin Li }; 158*67e74705SXin Li } 159*67e74705SXin Li 160*67e74705SXin Li namespace ElaboratedTypeSpecifiers { 161*67e74705SXin Li struct S { 162*67e74705SXin Li int f(int x = T<a, struct S>()); 163*67e74705SXin Li int h(int x = T<a, union __attribute__(()) U>()); 164*67e74705SXin Li int i(int x = T<a, enum E>()); 165*67e74705SXin Li int j(int x = T<a, struct S::template T<0, enum E>>()); 166*67e74705SXin Li template <int, typename> struct T { operator int(); }; 167*67e74705SXin Li static const int a = 0; 168*67e74705SXin Li enum E {}; 169*67e74705SXin Li }; 170*67e74705SXin Li } 171*67e74705SXin Li 172*67e74705SXin Li namespace PR20459 { 173*67e74705SXin Li template <typename EncTraits> struct A { 174*67e74705SXin Li void foo(int = EncTraits::template TypeEnc<int, int>::val); // ok 175*67e74705SXin Li }; 176*67e74705SXin Li } 177