// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic template<typename T> struct S { S() { } }; template<typename T> struct vector { void push_back(const T&) { int a[sizeof(T) ? -1: -1]; } // expected-error {{array with a negative size}} }; class ExprEngine { public: typedef vector<S<void *> >CheckersOrdered; CheckersOrdered Checkers; template <typename CHECKER> void registerCheck(CHECKER *check) { Checkers.push_back(S<void *>()); // expected-note {{in instantiation of member function 'vector<S<void *> >::push_back' requested here}} } }; class RetainReleaseChecker { }; void f(ExprEngine& Eng) { Eng.registerCheck(new RetainReleaseChecker); // expected-note {{in instantiation of function template specialization 'ExprEngine::registerCheck<RetainReleaseChecker>' requested here}} } // PR 5838 namespace test1 { template<typename T> struct A { int a; }; template<typename T> struct B : A<float>, A<T> { void f() { a = 0; // should not be ambiguous } }; template struct B<int>; struct O { int a; template<typename T> struct B : A<T> { void f() { a = 0; // expected-error {{'test1::O::a' is not a member of class 'test1::O::B<int>'}} } }; }; template struct O::B<int>; // expected-note {{in instantiation}} } // PR7248 namespace test2 { template <class T> struct A { void foo() { T::bar(); // expected-error {{type 'int' cannot}} } }; template <class T> class B { void foo(A<T> a) { a.test2::template A<T>::foo(); // expected-note {{in instantiation}} } }; template class B<int>; } namespace PR14124 { template<typename T> struct S { int value; }; template<typename T> void f() { S<T>::value; } // expected-error {{invalid use of non-static data member 'value'}} template void f<int>(); // expected-note {{in instantiation of}} struct List { List *next; }; template<typename T, T *(T::*p) = &T::next> struct A {}; A<List> a; // ok void operator&(struct Whatever); template<typename T, T *(T::*p) = &T::next> struct B {}; B<List> b; // still ok }