// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s // RUN: %clang_cc1 -std=c++98 -fsyntax-only -verify %s namespace test0 { namespace N { } template<typename T> struct A { void f(); }; template<typename T> struct B : A<T> { using A<T>::f; void g() { using namespace N; f(); } }; template struct B<int>; } namespace test1 { template <class Derived> struct Visitor1 { void Visit(struct Object1*); }; template <class Derived> struct Visitor2 { void Visit(struct Object2*); // expected-note {{candidate function}} }; template <class Derived> struct JoinVisitor : Visitor1<Derived>, Visitor2<Derived> { typedef Visitor1<Derived> Base1; typedef Visitor2<Derived> Base2; void Visit(struct Object1*); // expected-note {{candidate function}} using Base2::Visit; }; class Knot : public JoinVisitor<Knot> { }; void test() { Knot().Visit((struct Object1*) 0); Knot().Visit((struct Object2*) 0); Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}} } } // PR5847 namespace test2 { namespace ns { void foo(); } template <class T> void bar(T* ptr) { using ns::foo; foo(); } template void bar(char *); } namespace test3 { template <typename T> struct t { struct s1 { T f1() const; }; struct s2 : s1 { using s1::f1; T f1() const; }; }; void f2() { t<int>::s2 a; t<int>::s2 const & b = a; b.f1(); } } namespace PR16936 { // Make sure both using decls are properly considered for // overload resolution. template<class> struct A { void access(int); }; template<class> struct B { void access(); }; template<class CELL> struct X : public A<CELL>, public B<CELL> { using A<CELL>::access; using B<CELL>::access; void f() { access(0); } }; void f() { X<int> x; x.f(); } } namespace pr21923 { template <typename> struct Base { int field; void method(); }; template <typename Scalar> struct Derived : Base<Scalar> { using Base<Scalar>::field; using Base<Scalar>::method; static void m_fn1() { // expected-error@+1 {{invalid use of member 'field' in static member function}} (void)field; // expected-error@+1 {{invalid use of member 'field' in static member function}} (void)&field; // expected-error@+1 {{call to non-static member function without an object argument}} (void)method; // expected-error@+1 {{call to non-static member function without an object argument}} (void)&method; // expected-error@+1 {{call to non-static member function without an object argument}} method(); (void)&Base<Scalar>::field; (void)&Base<Scalar>::method; } #if __cplusplus >= 201103L // These usages are OK in C++11 due to the unevaluated context. enum { TheSize = sizeof(field) }; typedef decltype(field) U; #else // expected-error@+1 {{invalid use of non-static data member 'field'}} enum { TheSize = sizeof(field) }; #endif }; #if __cplusplus < 201103L // C++98 has an extra note for TheSize. // expected-note@+2 {{requested here}} #endif template class Derived<int>; // expected-note {{requested here}} // This is interesting because we form an UnresolvedLookupExpr in the static // function template and an UnresolvedMemberExpr in the instance function // template. As a result, we get slightly different behavior. struct UnresolvedTemplateNames { template <typename> void maybe_static(); #if __cplusplus < 201103L // expected-warning@+2 {{default template arguments for a function template are a C++11 extension}} #endif template <typename T, typename T::type = 0> static void maybe_static(); template <typename T> void instance_method() { (void)maybe_static<T>(); } template <typename T> static void static_method() { // expected-error@+1 {{call to non-static member function without an object argument}} (void)maybe_static<T>(); } }; void force_instantiation(UnresolvedTemplateNames x) { x.instance_method<int>(); UnresolvedTemplateNames::static_method<int>(); // expected-note {{requested here}} } } // pr21923