| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
- typedef double A;
- template<typename T> class B {
- typedef int A;
- };
- template<typename T> struct X : B<T> {
- static A a;
- };
- int a0[sizeof(X<int>::a) == sizeof(double) ? 1 : -1];
- // PR4365.
- template<class T> class Q;
- template<class T> class R : Q<T> {T current;};
- namespace test0 {
- template <class T> class Base {
- public:
- void instance_foo();
- static void static_foo();
- class Inner {
- public:
- void instance_foo();
- static void static_foo();
- };
- };
- template <class T> class Derived1 : Base<T> {
- public:
- void test0() {
- Base<T>::static_foo();
- Base<T>::instance_foo();
- }
- void test1() {
- Base<T>::Inner::static_foo();
- Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
- }
- static void test2() {
- Base<T>::static_foo();
- Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
- }
- static void test3() {
- Base<T>::Inner::static_foo();
- Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
- }
- };
- template <class T> class Derived2 : Base<T>::Inner {
- public:
- void test0() {
- Base<T>::static_foo();
- Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
- }
- void test1() {
- Base<T>::Inner::static_foo();
- Base<T>::Inner::instance_foo();
- }
- static void test2() {
- Base<T>::static_foo();
- Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
- }
- static void test3() {
- Base<T>::Inner::static_foo();
- Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}}
- }
- };
- void test0() {
- Derived1<int> d1;
- d1.test0();
- d1.test1(); // expected-note {{in instantiation of member function}}
- d1.test2(); // expected-note {{in instantiation of member function}}
- d1.test3(); // expected-note {{in instantiation of member function}}
- Derived2<int> d2;
- d2.test0(); // expected-note {{in instantiation of member function}}
- d2.test1();
- d2.test2(); // expected-note {{in instantiation of member function}}
- d2.test3(); // expected-note {{in instantiation of member function}}
- }
- }
- namespace test1 {
- template <class T> struct Base {
- void foo(T); // expected-note {{must qualify identifier to find this declaration in dependent base class}}
- };
- template <class T> struct Derived : Base<T> {
- void doFoo(T v) {
- foo(v); // expected-error {{use of undeclared identifier}}
- }
- };
- template struct Derived<int>; // expected-note {{requested here}}
- }
- namespace PR8966 {
- template <class T>
- class MyClassCore
- {
- };
- template <class T>
- class MyClass : public MyClassCore<T>
- {
- public:
- enum {
- N
- };
- // static member declaration
- static const char* array [N];
- void f() {
- MyClass<T>::InBase = 17;
- }
- };
- // static member definition
- template <class T>
- const char* MyClass<T>::array [MyClass<T>::N] = { "A", "B", "C" };
- }
- namespace std {
- inline namespace v1 {
- template<typename T> struct basic_ostream;
- }
- namespace inner {
- template<typename T> struct vector {};
- }
- using inner::vector;
- template<typename T, typename U> struct pair {};
- typedef basic_ostream<char> ostream;
- extern ostream cout;
- std::ostream &operator<<(std::ostream &out, const char *);
- }
- namespace PR10053 {
- template<typename T> struct A {
- T t;
- A() {
- f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}}
- }
- };
- void f(int&); // expected-note {{'f' should be declared prior to the call site}}
- A<int> a; // expected-note {{in instantiation of member function}}
- namespace N {
- namespace M {
- template<typename T> int g(T t) {
- f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}}
- };
- }
- void f(char&); // expected-note {{'f' should be declared prior to the call site}}
- }
- void f(char&);
- int k = N::M::g<char>(0);; // expected-note {{in instantiation of function}}
- namespace O {
- void f(char&); // expected-note {{candidate function not viable}}
- template<typename T> struct C {
- static const int n = f(T()); // expected-error {{no matching function}}
- };
- }
- int f(double); // no note, shadowed by O::f
- O::C<double> c; // expected-note {{requested here}}
- // Example from www/compatibility.html
- namespace my_file {
- template <typename T> T Squared(T x) {
- return Multiply(x, x); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
- }
- int Multiply(int x, int y) { // expected-note {{should be declared prior to the call site}}
- return x * y;
- }
- int main() {
- Squared(5); // expected-note {{here}}
- }
- }
- // Example from www/compatibility.html
- namespace my_file2 {
- template<typename T>
- void Dump(const T& value) {
- std::cout << value << "\n"; // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
- }
- namespace ns {
- struct Data {};
- }
- std::ostream& operator<<(std::ostream& out, ns::Data data) { // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2::ns'}}
- return out << "Some data";
- }
- void Use() {
- Dump(ns::Data()); // expected-note {{here}}
- }
- }
- namespace my_file2_a {
- template<typename T>
- void Dump(const T &value) {
- print(std::cout, value); // expected-error 4{{neither visible in the template definition nor found by argument-dependent lookup}}
- }
- namespace ns {
- struct Data {};
- }
- namespace ns2 {
- struct Data {};
- }
- std::ostream &print(std::ostream &out, int); // expected-note-re {{should be declared prior to the call site{{$}}}}
- std::ostream &print(std::ostream &out, ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns'}}
- std::ostream &print(std::ostream &out, std::vector<ns2::Data>); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns2'}}
- std::ostream &print(std::ostream &out, std::pair<ns::Data, ns2::Data>); // expected-note {{should be declared prior to the call site or in an associated namespace of one of its arguments}}
- void Use() {
- Dump(0); // expected-note {{requested here}}
- Dump(ns::Data()); // expected-note {{requested here}}
- Dump(std::vector<ns2::Data>()); // expected-note {{requested here}}
- Dump(std::pair<ns::Data, ns2::Data>()); // expected-note {{requested here}}
- }
- }
- namespace unary {
- template<typename T>
- T Negate(const T& value) {
- return !value; // expected-error {{call to function 'operator!' that is neither visible in the template definition nor found by argument-dependent lookup}}
- }
- namespace ns {
- struct Data {};
- }
- ns::Data operator!(ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::unary::ns'}}
- void Use() {
- Negate(ns::Data()); // expected-note {{requested here}}
- }
- }
- }
- namespace PR10187 {
- namespace A1 {
- template<typename T>
- struct S {
- void f() {
- for (auto &a : e)
- __range(a); // expected-error {{undeclared identifier '__range'}}
- }
- int e[10];
- };
- void g() {
- S<int>().f(); // expected-note {{here}}
- }
- }
- namespace A2 {
- template<typename T>
- struct S {
- void f() {
- for (auto &a : e)
- __range(a); // expected-error {{undeclared identifier '__range'}}
- }
- T e[10];
- };
- void g() {
- S<int>().f(); // expected-note {{here}}
- }
- struct X {};
- void __range(X);
- void h() {
- S<X>().f();
- }
- }
- namespace B {
- template<typename T> void g(); // expected-note {{not viable}}
- template<typename T> void f() {
- g<int>(T()); // expected-error {{no matching function}}
- }
- namespace {
- struct S {};
- }
- void g(S);
- template void f<S>(); // expected-note {{here}}
- }
- }
- namespace rdar11242625 {
- template <typename T>
- struct Main {
- struct default_names {
- typedef int id;
- };
- template <typename T2 = typename default_names::id>
- struct TS {
- T2 q;
- };
- };
- struct Sub : public Main<int> {
- TS<> ff;
- };
- int arr[sizeof(Sub)];
- }
- namespace PR11421 {
- template < unsigned > struct X {
- static const unsigned dimension = 3;
- template<unsigned dim=dimension>
- struct Y: Y<dim> { }; // expected-error{{circular inheritance between 'Y<dim>' and 'Y<dim>'}}
- };
- typedef X<3> X3;
- X3::Y<>::iterator it; // expected-error {{no type named 'iterator' in 'PR11421::X<3>::Y<3>'}}
- }
- namespace rdar12629723 {
- template<class T>
- struct X {
- struct C : public C { }; // expected-error{{circular inheritance between 'rdar12629723::X::C' and 'rdar12629723::X::C'}}
- struct B;
- struct A : public B { // expected-note{{'rdar12629723::X::A' declared here}}
- virtual void foo() { }
- };
- struct D : T::foo { };
- struct E : D { };
- };
- template<class T>
- struct X<T>::B : public A { // expected-error{{circular inheritance between 'rdar12629723::X::A' and 'rdar12629723::X::B'}}
- virtual void foo() { }
- };
- }
- namespace test_reserved_identifiers {
- template<typename A, typename B> void tempf(A a, B b) {
- a + b; // expected-error{{call to function 'operator+' that is neither visible in the template definition nor found by argument-dependent lookup}}
- }
- namespace __gnu_cxx { struct X {}; }
- namespace ns { struct Y {}; }
- void operator+(__gnu_cxx::X, ns::Y); // expected-note{{or in namespace 'test_reserved_identifiers::ns'}}
- void test() {
- __gnu_cxx::X x;
- ns::Y y;
- tempf(x, y); // expected-note{{in instantiation of}}
- }
- }
- // This test must live in the global namespace.
- struct PR14695_X {};
- // FIXME: This note is bogus; it is the using directive which would need to move
- // to prior to the call site to fix the problem.
- namespace PR14695_A { void PR14695_f(PR14695_X); } // expected-note {{'PR14695_f' should be declared prior to the call site or in the global namespace}}
- template<typename T> void PR14695_g(T t) { PR14695_f(t); } // expected-error {{call to function 'PR14695_f' that is neither visible in the template definition nor found by argument-dependent lookup}}
- using namespace PR14695_A;
- template void PR14695_g(PR14695_X); // expected-note{{requested here}}
- namespace OperatorNew {
- template<typename T> void f(T t) {
- operator new(100, t); // expected-error{{call to function 'operator new' that is neither visible in the template definition nor found by argument-dependent lookup}}
- // FIXME: This should give the same error.
- new (t) int;
- }
- struct X {};
- };
- using size_t = decltype(sizeof(0));
- void *operator new(size_t, OperatorNew::X); // expected-note-re {{should be declared prior to the call site{{$}}}}
- template void OperatorNew::f(OperatorNew::X); // expected-note {{instantiation of}}
- namespace PR19936 {
- template<typename T> decltype(*T()) f() {} // expected-note {{previous}}
- template<typename T> decltype(T() * T()) g() {} // expected-note {{previous}}
- // Create some overloaded operators so we build an overload operator call
- // instead of a builtin operator call for the dependent expression.
- enum E {};
- int operator*(E);
- int operator*(E, E);
- // Check that they still profile the same.
- template<typename T> decltype(*T()) f() {} // expected-error {{redefinition}}
- template<typename T> decltype(T() * T()) g() {} // expected-error {{redefinition}}
- }
- template <typename> struct CT2 {
- template <class U> struct X;
- };
- template <typename T> int CT2<int>::X<>; // expected-error {{template parameter list matching the non-templated nested type 'CT2<int>' should be empty}}
|