// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %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 A { 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 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}} } }