1*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s 2*67e74705SXin Li template<typename T, typename U> 3*67e74705SXin Li struct X0 { fX04*67e74705SXin Li void f(T x, U y) { 5*67e74705SXin Li (void)(x + y); // expected-error{{invalid operands}} 6*67e74705SXin Li } 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li struct X1 { }; 10*67e74705SXin Li 11*67e74705SXin Li template struct X0<int, float>; 12*67e74705SXin Li template struct X0<int*, int>; 13*67e74705SXin Li template struct X0<int X1::*, int>; // expected-note{{instantiation of}} 14*67e74705SXin Li 15*67e74705SXin Li template<typename T> 16*67e74705SXin Li struct X2 { 17*67e74705SXin Li void f(T); 18*67e74705SXin Li gX219*67e74705SXin Li T g(T x, T y) { 20*67e74705SXin Li /* DeclStmt */; 21*67e74705SXin Li T *xp = &x, &yr = y; // expected-error{{pointer to a reference}} 22*67e74705SXin Li /* NullStmt */; 23*67e74705SXin Li } 24*67e74705SXin Li }; 25*67e74705SXin Li 26*67e74705SXin Li template struct X2<int>; 27*67e74705SXin Li template struct X2<int&>; // expected-note{{instantiation of}} 28*67e74705SXin Li 29*67e74705SXin Li template<typename T> 30*67e74705SXin Li struct X3 { fX331*67e74705SXin Li void f(T) { 32*67e74705SXin Li Label: 33*67e74705SXin Li T x; 34*67e74705SXin Li goto Label; 35*67e74705SXin Li } 36*67e74705SXin Li }; 37*67e74705SXin Li 38*67e74705SXin Li template struct X3<int>; 39*67e74705SXin Li 40*67e74705SXin Li template <typename T> struct X4 { fX441*67e74705SXin Li T f() const { 42*67e74705SXin Li return; // expected-error{{non-void function 'f' should return a value}} 43*67e74705SXin Li } 44*67e74705SXin Li gX445*67e74705SXin Li T g() const { 46*67e74705SXin Li return 1; // expected-error{{void function 'g' should not return a value}} 47*67e74705SXin Li } 48*67e74705SXin Li }; 49*67e74705SXin Li 50*67e74705SXin Li template struct X4<void>; // expected-note{{in instantiation of}} 51*67e74705SXin Li template struct X4<int>; // expected-note{{in instantiation of}} 52*67e74705SXin Li 53*67e74705SXin Li struct Incomplete; // expected-note 2{{forward declaration}} 54*67e74705SXin Li 55*67e74705SXin Li template<typename T> struct X5 { fX556*67e74705SXin Li T f() { } // expected-error{{incomplete result type}} 57*67e74705SXin Li }; 58*67e74705SXin Li void test_X5(X5<Incomplete> x5); // okay! 59*67e74705SXin Li 60*67e74705SXin Li template struct X5<Incomplete>; // expected-note{{instantiation}} 61*67e74705SXin Li 62*67e74705SXin Li template<typename T, typename U, typename V> struct X6 { fX663*67e74705SXin Li U f(T t, U u, V v) { 64*67e74705SXin Li // IfStmt 65*67e74705SXin Li if (t > 0) 66*67e74705SXin Li return u; 67*67e74705SXin Li else { 68*67e74705SXin Li if (t < 0) 69*67e74705SXin Li return v; // expected-error{{cannot initialize return object of type}} 70*67e74705SXin Li } 71*67e74705SXin Li 72*67e74705SXin Li if (T x = t) { 73*67e74705SXin Li t = x; 74*67e74705SXin Li } 75*67e74705SXin Li return v; // expected-error{{cannot initialize return object of type}} 76*67e74705SXin Li } 77*67e74705SXin Li }; 78*67e74705SXin Li 79*67e74705SXin Li struct ConvertibleToInt { 80*67e74705SXin Li operator int() const; 81*67e74705SXin Li }; 82*67e74705SXin Li 83*67e74705SXin Li template struct X6<ConvertibleToInt, float, char>; 84*67e74705SXin Li template struct X6<bool, int, int*>; // expected-note{{instantiation}} 85*67e74705SXin Li 86*67e74705SXin Li template <typename T> struct X7 { fX787*67e74705SXin Li void f() { 88*67e74705SXin Li void *v = this; 89*67e74705SXin Li } 90*67e74705SXin Li }; 91*67e74705SXin Li 92*67e74705SXin Li template struct X7<int>; 93*67e74705SXin Li 94*67e74705SXin Li template<typename T> struct While0 { fWhile095*67e74705SXin Li void f(T t) { 96*67e74705SXin Li while (t) { 97*67e74705SXin Li } 98*67e74705SXin Li 99*67e74705SXin Li while (T t2 = T()) ; 100*67e74705SXin Li } 101*67e74705SXin Li }; 102*67e74705SXin Li 103*67e74705SXin Li template struct While0<float>; 104*67e74705SXin Li 105*67e74705SXin Li template<typename T> struct Do0 { fDo0106*67e74705SXin Li void f(T t) { 107*67e74705SXin Li do { 108*67e74705SXin Li } while (t); // expected-error{{not contextually}} 109*67e74705SXin Li } 110*67e74705SXin Li }; 111*67e74705SXin Li 112*67e74705SXin Li struct NotConvertibleToBool { }; 113*67e74705SXin Li template struct Do0<ConvertibleToInt>; 114*67e74705SXin Li template struct Do0<NotConvertibleToBool>; // expected-note{{instantiation}} 115*67e74705SXin Li 116*67e74705SXin Li template<typename T> struct For0 { fFor0117*67e74705SXin Li void f(T f, T l) { 118*67e74705SXin Li for (; f != l; ++f) { 119*67e74705SXin Li if (*f) 120*67e74705SXin Li continue; 121*67e74705SXin Li else if (*f == 17) 122*67e74705SXin Li break; 123*67e74705SXin Li } 124*67e74705SXin Li } 125*67e74705SXin Li }; 126*67e74705SXin Li 127*67e74705SXin Li template struct For0<int*>; 128*67e74705SXin Li 129*67e74705SXin Li template<typename T> struct Member0 { fMember0130*67e74705SXin Li void f(T t) { 131*67e74705SXin Li t; 132*67e74705SXin Li t.f; 133*67e74705SXin Li t->f; 134*67e74705SXin Li 135*67e74705SXin Li T* tp; 136*67e74705SXin Li tp.f; // expected-error{{member reference base type 'T *' is not a structure or union}} 137*67e74705SXin Li tp->f; 138*67e74705SXin Li 139*67e74705SXin Li this->f; 140*67e74705SXin Li this.f; // expected-error{{member reference base type 'Member0<T> *' is not a structure or union}} 141*67e74705SXin Li } 142*67e74705SXin Li }; 143*67e74705SXin Li 144*67e74705SXin Li template<typename T, typename U> struct Switch0 { fSwitch0145*67e74705SXin Li U f(T value, U v0, U v1, U v2) { 146*67e74705SXin Li switch (value) { 147*67e74705SXin Li case 0: return v0; 148*67e74705SXin Li 149*67e74705SXin Li case 1: return v1; 150*67e74705SXin Li 151*67e74705SXin Li case 2: // fall through 152*67e74705SXin Li 153*67e74705SXin Li default: 154*67e74705SXin Li return v2; 155*67e74705SXin Li } 156*67e74705SXin Li } 157*67e74705SXin Li }; 158*67e74705SXin Li 159*67e74705SXin Li template struct Switch0<int, float>; 160*67e74705SXin Li 161*67e74705SXin Li template<typename T, int I1, int I2> struct Switch1 { fSwitch1162*67e74705SXin Li T f(T x, T y, T z) { 163*67e74705SXin Li switch (x) { 164*67e74705SXin Li case I1: return y; // expected-note{{previous}} 165*67e74705SXin Li case I2: return z; // expected-error{{duplicate}} 166*67e74705SXin Li default: return x; 167*67e74705SXin Li } 168*67e74705SXin Li } 169*67e74705SXin Li }; 170*67e74705SXin Li 171*67e74705SXin Li template struct Switch1<int, 1, 2>; 172*67e74705SXin Li template struct Switch1<int, 2, 2>; // expected-note{{instantiation}} 173*67e74705SXin Li 174*67e74705SXin Li template<typename T> struct IndirectGoto0 { fIndirectGoto0175*67e74705SXin Li void f(T x) { 176*67e74705SXin Li // FIXME: crummy error message below 177*67e74705SXin Li goto *x; // expected-error{{incompatible}} 178*67e74705SXin Li 179*67e74705SXin Li prior: 180*67e74705SXin Li T prior_label; 181*67e74705SXin Li prior_label = &&prior; // expected-error{{assigning to 'int'}} 182*67e74705SXin Li 183*67e74705SXin Li T later_label; 184*67e74705SXin Li later_label = &&later; // expected-error{{assigning to 'int'}} 185*67e74705SXin Li 186*67e74705SXin Li later: 187*67e74705SXin Li (void)(1+1); 188*67e74705SXin Li } 189*67e74705SXin Li }; 190*67e74705SXin Li 191*67e74705SXin Li template struct IndirectGoto0<void*>; 192*67e74705SXin Li template struct IndirectGoto0<int>; // expected-note{{instantiation}} 193*67e74705SXin Li 194*67e74705SXin Li template<typename T> struct TryCatch0 { fTryCatch0195*67e74705SXin Li void f() { 196*67e74705SXin Li try { 197*67e74705SXin Li } catch (T t) { // expected-error{{incomplete type}} \ 198*67e74705SXin Li // expected-error{{abstract class}} 199*67e74705SXin Li } catch (...) { 200*67e74705SXin Li } 201*67e74705SXin Li } 202*67e74705SXin Li }; 203*67e74705SXin Li 204*67e74705SXin Li struct Abstract { 205*67e74705SXin Li virtual void foo() = 0; // expected-note{{pure virtual}} 206*67e74705SXin Li }; 207*67e74705SXin Li 208*67e74705SXin Li template struct TryCatch0<int>; // okay 209*67e74705SXin Li template struct TryCatch0<Incomplete*>; // expected-note{{instantiation}} 210*67e74705SXin Li template struct TryCatch0<Abstract>; // expected-note{{instantiation}} 211*67e74705SXin Li 212*67e74705SXin Li // PR4383 213*67e74705SXin Li template<typename T> struct X; 214*67e74705SXin Li template<typename T> struct Y : public X<T> { xY215*67e74705SXin Li Y& x() { return *this; } 216*67e74705SXin Li }; 217*67e74705SXin Li 218*67e74705SXin Li // Make sure our assertions don't get too uppity. 219*67e74705SXin Li namespace test0 { 220*67e74705SXin Li template <class T> class A { void foo(T array[10]); }; 221*67e74705SXin Li template class A<int>; 222*67e74705SXin Li } 223*67e74705SXin Li 224*67e74705SXin Li namespace PR7016 { f()225*67e74705SXin Li template<typename T> void f() { T x = x; } 226*67e74705SXin Li template void f<int>(); 227*67e74705SXin Li } 228*67e74705SXin Li 229*67e74705SXin Li namespace PR9880 { 230*67e74705SXin Li struct lua_State; 231*67e74705SXin Li struct no_tag { char a; }; // (A) 232*67e74705SXin Li struct yes_tag { long a; long b; }; // (A) 233*67e74705SXin Li 234*67e74705SXin Li template <typename T> 235*67e74705SXin Li struct HasIndexMetamethod { 236*67e74705SXin Li template <typename U> 237*67e74705SXin Li static no_tag check(...); 238*67e74705SXin Li template <typename U> 239*67e74705SXin Li static yes_tag check(char[sizeof(&U::luaIndex)]); 240*67e74705SXin Li enum { value = sizeof(check<T>(0)) == sizeof(yes_tag) }; 241*67e74705SXin Li }; 242*67e74705SXin Li 243*67e74705SXin Li class SomeClass { 244*67e74705SXin Li public: 245*67e74705SXin Li int luaIndex(lua_State* L); 246*67e74705SXin Li }; 247*67e74705SXin Li 248*67e74705SXin Li int i = HasIndexMetamethod<SomeClass>::value; 249*67e74705SXin Li } 250