// RUN: %clang_cc1 -std=c++98 -fsyntax-only -verify %s // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s // RUN: %clang_cc1 -fsyntax-only -verify %s struct B { void f(char); void g(char); enum E { e }; union { int x; }; enum class EC { ec }; // expected-warning 0-1 {{C++11}} void f2(char); void g2(char); enum E2 { e2 }; union { int x2; }; }; class C { int g(); }; struct D : B {}; class D2 : public B { using B::f; using B::E; using B::e; using B::x; using C::g; // expected-error{{using declaration refers into 'C::', which is not a base class of 'D2'}} // These are valid in C++98 but not in C++11. using D::f2; using D::E2; using D::e2; using D::x2; #if __cplusplus >= 201103L // expected-error@-5 {{using declaration refers into 'D::', which is not a base class of 'D2'}} // expected-error@-5 {{using declaration refers into 'D::', which is not a base class of 'D2'}} // expected-error@-5 {{using declaration refers into 'D::', which is not a base class of 'D2'}} // expected-error@-5 {{using declaration refers into 'D::', which is not a base class of 'D2'}} #endif using B::EC; using B::EC::ec; // expected-error {{not a class}} expected-warning 0-1 {{C++11}} }; namespace test1 { struct Base { int foo(); }; struct Unrelated { int foo(); }; struct Subclass : Base { }; namespace InnerNS { int foo(); } struct B : Base { }; // We should be able to diagnose these without instantiation. template <class T> struct C : Base { using InnerNS::foo; // expected-error {{not a class}} using Base::bar; // expected-error {{no member named 'bar'}} using Unrelated::foo; // expected-error {{not a base class}} // In C++98, it's hard to see that these are invalid, because indirect // references to base class members are permitted. using C::foo; using Subclass::foo; #if __cplusplus >= 201103L // expected-error@-3 {{refers to its own class}} // expected-error@-3 {{not a base class}} #endif }; }