1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic 2*67e74705SXin Li template<typename T> 3*67e74705SXin Li struct S { SS4*67e74705SXin Li S() { } 5*67e74705SXin Li }; 6*67e74705SXin Li 7*67e74705SXin Li template<typename T> 8*67e74705SXin Li struct vector { push_backvector9*67e74705SXin Li void push_back(const T&) { int a[sizeof(T) ? -1: -1]; } // expected-error {{array with a negative size}} 10*67e74705SXin Li }; 11*67e74705SXin Li 12*67e74705SXin Li class ExprEngine { 13*67e74705SXin Li public: 14*67e74705SXin Li typedef vector<S<void *> >CheckersOrdered; 15*67e74705SXin Li CheckersOrdered Checkers; 16*67e74705SXin Li 17*67e74705SXin Li template <typename CHECKER> registerCheck(CHECKER * check)18*67e74705SXin Li void registerCheck(CHECKER *check) { 19*67e74705SXin Li Checkers.push_back(S<void *>()); // expected-note {{in instantiation of member function 'vector<S<void *> >::push_back' requested here}} 20*67e74705SXin Li } 21*67e74705SXin Li }; 22*67e74705SXin Li 23*67e74705SXin Li class RetainReleaseChecker { }; 24*67e74705SXin Li f(ExprEngine & Eng)25*67e74705SXin Livoid f(ExprEngine& Eng) { 26*67e74705SXin Li Eng.registerCheck(new RetainReleaseChecker); // expected-note {{in instantiation of function template specialization 'ExprEngine::registerCheck<RetainReleaseChecker>' requested here}} 27*67e74705SXin Li } 28*67e74705SXin Li 29*67e74705SXin Li // PR 5838 30*67e74705SXin Li namespace test1 { 31*67e74705SXin Li template<typename T> struct A { 32*67e74705SXin Li int a; 33*67e74705SXin Li }; 34*67e74705SXin Li 35*67e74705SXin Li template<typename T> struct B : A<float>, A<T> { ftest1::B36*67e74705SXin Li void f() { 37*67e74705SXin Li a = 0; // should not be ambiguous 38*67e74705SXin Li } 39*67e74705SXin Li }; 40*67e74705SXin Li template struct B<int>; 41*67e74705SXin Li 42*67e74705SXin Li struct O { 43*67e74705SXin Li int a; 44*67e74705SXin Li template<typename T> struct B : A<T> { ftest1::O::B45*67e74705SXin Li void f() { 46*67e74705SXin Li a = 0; // expected-error {{'test1::O::a' is not a member of class 'test1::O::B<int>'}} 47*67e74705SXin Li } 48*67e74705SXin Li }; 49*67e74705SXin Li }; 50*67e74705SXin Li template struct O::B<int>; // expected-note {{in instantiation}} 51*67e74705SXin Li } 52*67e74705SXin Li 53*67e74705SXin Li // PR7248 54*67e74705SXin Li namespace test2 { 55*67e74705SXin Li template <class T> struct A { footest2::A56*67e74705SXin Li void foo() { 57*67e74705SXin Li T::bar(); // expected-error {{type 'int' cannot}} 58*67e74705SXin Li } 59*67e74705SXin Li }; 60*67e74705SXin Li 61*67e74705SXin Li template <class T> class B { foo(A<T> a)62*67e74705SXin Li void foo(A<T> a) { 63*67e74705SXin Li a.test2::template A<T>::foo(); // expected-note {{in instantiation}} 64*67e74705SXin Li } 65*67e74705SXin Li }; 66*67e74705SXin Li 67*67e74705SXin Li template class B<int>; 68*67e74705SXin Li } 69*67e74705SXin Li 70*67e74705SXin Li namespace PR14124 { 71*67e74705SXin Li template<typename T> struct S { 72*67e74705SXin Li int value; 73*67e74705SXin Li }; f()74*67e74705SXin Li template<typename T> void f() { S<T>::value; } // expected-error {{invalid use of non-static data member 'value'}} 75*67e74705SXin Li template void f<int>(); // expected-note {{in instantiation of}} 76*67e74705SXin Li 77*67e74705SXin Li struct List { List *next; }; 78*67e74705SXin Li template<typename T, T *(T::*p) = &T::next> struct A {}; 79*67e74705SXin Li A<List> a; // ok 80*67e74705SXin Li void operator&(struct Whatever); 81*67e74705SXin Li template<typename T, T *(T::*p) = &T::next> struct B {}; 82*67e74705SXin Li B<List> b; // still ok 83*67e74705SXin Li } 84