84 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic2template<typename T>3struct S {4 S() { }5};6 7template<typename T>8struct vector {9 void push_back(const T&) { int a[sizeof(T) ? -1: -1]; } // expected-error {{array with a negative size}}10};11 12class ExprEngine {13public: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 23class RetainReleaseChecker { };24 25void 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 583830namespace 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 ambiguous38 }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// PR724854namespace 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 70namespace 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; // ok80 void operator&(struct Whatever);81 template<typename T, T *(T::*p) = &T::next> struct B {};82 B<List> b; // still ok83}84