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