diff options
Diffstat (limited to 'test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p3.cpp')
-rw-r--r-- | test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p3.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p3.cpp b/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p3.cpp new file mode 100644 index 0000000000000..6c505a55c2afc --- /dev/null +++ b/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p3.cpp @@ -0,0 +1,82 @@ +// 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 + }; +} |