diff options
author | Anders Carlsson <andersca@mac.com> | 2009-03-27 06:03:27 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-03-27 06:03:27 +0000 |
commit | c4f1e87138bfe5d3aaccff13c86b383a255bca42 (patch) | |
tree | c5e824622650f3f0af8391b0967c2a8c4c497d44 /test/SemaCXX/access-base-class.cpp | |
parent | 214f31a347d7824eb92e6a3f5dce4d4047fd5ae0 (diff) |
Implement checking for base class access. Right now it's overly conservative but that will change. (Also, protected isn't implemented right now).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67827 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaCXX/access-base-class.cpp')
-rw-r--r-- | test/SemaCXX/access-base-class.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/SemaCXX/access-base-class.cpp b/test/SemaCXX/access-base-class.cpp new file mode 100644 index 0000000000..29586759b0 --- /dev/null +++ b/test/SemaCXX/access-base-class.cpp @@ -0,0 +1,51 @@ +// RUN: clang-cc -fsyntax-only -verify %s +namespace T1 { + +class A { }; +class B : private A { }; // expected-note {{'private' inheritance specifier here}} + +void f(B* b) { + A *a = b; // expected-error{{conversion from 'class T1::B' to inaccessible base class 'class T1::A'}} \ + expected-error{{incompatible type initializing 'class T1::B *', expected 'class T1::A *'}} +} + +} + +namespace T2 { + +class A { }; +class B : A { }; // expected-note {{inheritance is implicitly 'private'}} + +void f(B* b) { + A *a = b; // expected-error {{conversion from 'class T2::B' to inaccessible base class 'class T2::A'}} \ + expected-error {{incompatible type initializing 'class T2::B *', expected 'class T2::A *'}} +} + +} + +namespace T3 { + +class A { }; +class B : public A { }; + +void f(B* b) { + A *a = b; +} + +} + +namespace T4 { + +class A {}; + +class B : private virtual A {}; +class C : public virtual A {}; + +class D : public B, public C {}; + +void f(D *d) { + // This takes the D->C->B->A path. + A *a = d; +} + +} |