// RUN: %clang_cc1 -fms-compatibility -fsyntax-only -verify %s template <class T> class A { public: void f(T a) { }// expected-note {{must qualify identifier to find this declaration in dependent base class}} void g();// expected-note {{must qualify identifier to find this declaration in dependent base class}} }; template <class T> class B : public A<T> { public: void z(T a) { f(a); // expected-warning {{use of identifier 'f' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} g(); // expected-warning {{use of identifier 'g' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} } }; template class B<int>; // expected-note {{requested here}} template class B<char>; void test() { B<int> b; b.z(3); } namespace lookup_dependent_bases_id_expr { template<class T> class A { public: int var; }; template<class T> class B : public A<T> { public: void f() { var = 3; } }; template class B<int>; } namespace lookup_dependent_base_class_static_function { template <class T> class A { public: static void static_func();// expected-note {{must qualify identifier to find this declaration in dependent base class}} void func();// expected-note {{must qualify identifier to find this declaration in dependent base class}} }; template <class T> class B : public A<T> { public: static void z2(){ static_func(); // expected-warning {{use of identifier 'static_func' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} func(); // expected-warning {{use of identifier 'func' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} expected-error {{call to non-static member function without an object argument}} } }; template class B<int>; // expected-note {{requested here}} } namespace lookup_dependent_base_class_default_argument { template<class T> class A { public: static int f1(); // expected-note {{must qualify identifier to find this declaration in dependent base class}} int f2(); // expected-note {{must qualify identifier to find this declaration in dependent base class}} }; template<class T> class B : public A<T> { public: void g1(int p = f1());// expected-warning {{use of identifier 'f1' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} void g2(int p = f2());// expected-warning {{use of identifier 'f2' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} expected-error {{call to non-static member function without an object argument}} }; void foo() { B<int> b; b.g1(); // expected-note {{required here}} b.g2(); // expected-note {{required here}} } } namespace lookup_dependent_base_class_friend { template <class T> class B { public: static void g(); // expected-note {{must qualify identifier to find this declaration in dependent base class}} }; template <class T> class A : public B<T> { public: friend void foo(A<T> p){ g(); // expected-warning {{use of identifier 'g' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} } }; int main2() { A<int> a; foo(a); // expected-note {{requested here}} } } namespace lookup_dependent_base_no_typo_correction { class C { public: int m_hWnd; }; template <class T> class A : public T { public: void f(int hWnd) { m_hWnd = 1; } }; template class A<C>; } namespace PR12701 { class A {}; class B {}; template <class T> class Base { public: bool base_fun(void* p) { return false; } // expected-note {{must qualify identifier to find this declaration in dependent base clas}} operator T*() const { return 0; } }; template <class T> class Container : public Base<T> { public: template <typename S> bool operator=(const Container<S>& rhs) { return base_fun(rhs); // expected-warning {{use of identifier 'base_fun' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}} } }; void f() { Container<A> text_provider; Container<B> text_provider2; text_provider2 = text_provider; // expected-note {{in instantiation of function template specialization}} } } // namespace PR12701