Mercurial > hg > CbC > CbC_llvm
comparison clang/test/SemaTemplate/instantiate-member-expr.cpp @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 |
parents | |
children | 0572611fdcc8 |
comparison
equal
deleted
inserted
replaced
147:c2174574ed3a | 150:1d019706d866 |
---|---|
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 } |