| // 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 | 
 | } |