// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s typedef double A; template class B { typedef int A; }; template struct X : B { static A a; }; int a0[sizeof(X::a) == sizeof(double) ? 1 : -1]; // PR4365. template class Q; template class R : Q {T current;}; namespace test0 { template class Base { public: void instance_foo(); static void static_foo(); class Inner { public: void instance_foo(); static void static_foo(); }; }; template class Derived1 : Base { public: void test0() { Base::static_foo(); Base::instance_foo(); } void test1() { Base::Inner::static_foo(); Base::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } static void test2() { Base::static_foo(); Base::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } static void test3() { Base::Inner::static_foo(); Base::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } }; template class Derived2 : Base::Inner { public: void test0() { Base::static_foo(); Base::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } void test1() { Base::Inner::static_foo(); Base::Inner::instance_foo(); } static void test2() { Base::static_foo(); Base::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } static void test3() { Base::Inner::static_foo(); Base::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } }; void test0() { Derived1 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 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 struct Base { void foo(T); // expected-note {{must qualify identifier to find this declaration in dependent base class}} }; template struct Derived : Base { void doFoo(T v) { foo(v); // expected-error {{use of undeclared identifier}} } }; template struct Derived; // expected-note {{requested here}} } namespace PR8966 { template class MyClassCore { }; template class MyClass : public MyClassCore { public: enum { N }; // static member declaration static const char* array [N]; void f() { MyClass::InBase = 17; } }; // static member definition template const char* MyClass::array [MyClass::N] = { "A", "B", "C" }; } namespace std { inline namespace v1 { template struct basic_ostream; } namespace inner { template struct vector {}; } using inner::vector; template struct pair {}; typedef basic_ostream ostream; extern ostream cout; std::ostream &operator<<(std::ostream &out, const char *); } namespace PR10053 { template 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 a; // expected-note {{in instantiation of member function}} namespace N { namespace M { template 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(0);; // expected-note {{in instantiation of function}} namespace O { void f(char&); // expected-note {{candidate function not viable}} template struct C { static const int n = f(T()); // expected-error {{no matching function}} }; } int f(double); // no note, shadowed by O::f O::C c; // expected-note {{requested here}} // Example from www/compatibility.html namespace my_file { template 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 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 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); // 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); // 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()); // expected-note {{requested here}} Dump(std::pair()); // expected-note {{requested here}} } } namespace unary { template 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 A { template struct S { void f() { for (auto &a : e) __range(a); // expected-error {{undeclared identifier '__range'}} } int e[10]; }; void g() { S().f(); // expected-note {{here}} } } namespace B { template void g(); // expected-note {{not viable}} template void f() { g(T()); // expected-error {{no matching function}} } namespace { struct S {}; } void g(S); template void f(); // expected-note {{here}} } } namespace rdar11242625 { template struct Main { struct default_names { typedef int id; }; template struct TS { T2 q; }; }; struct Sub : public Main { TS<> ff; }; int arr[sizeof(Sub)]; } namespace PR11421 { template < unsigned > struct X { static const unsigned dimension = 3; template struct Y: Y { }; // expected-error {{incomplete type}} expected-note {{is not complete until the closing}} }; typedef X<3> X3; X3::Y<>::iterator it; // expected-note {{requested here}} }