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