diff options
author | John McCall <rjmccall@apple.com> | 2013-02-27 00:08:19 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2013-02-27 00:08:19 +0000 |
commit | 714b509bb4f8be76e6616944551efe7a6e8358cd (patch) | |
tree | 4ffab68380a73be779156880f19be34bc5679c8d /test/CXX/class.access/class.access.base/p5.cpp | |
parent | 899245792776dd219a3c36eb19b42272e270bc0c (diff) |
Don't crash when diagnosing path-constrained protected
access to a private member to which we have special access.
rdar://12926092
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176146 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CXX/class.access/class.access.base/p5.cpp')
-rw-r--r-- | test/CXX/class.access/class.access.base/p5.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/test/CXX/class.access/class.access.base/p5.cpp b/test/CXX/class.access/class.access.base/p5.cpp index 255fbfc9fc..5b08a86199 100644 --- a/test/CXX/class.access/class.access.base/p5.cpp +++ b/test/CXX/class.access/class.access.base/p5.cpp @@ -72,4 +72,27 @@ namespace test3 { }; } +// Don't crash. <rdar://12926092> +// Note that 'field' is indeed a private member of X but that access +// is indeed ultimately constrained by the protected inheritance from Y. +// If someone wants to put the effort into improving this diagnostic, +// they can feel free; even explaining it in person would be a pain. +namespace test4 { + class Z; + class X { + public: + void f(Z *p); + + private: + int field; // expected-note {{member is declared here}} + }; + + class Y : public X { }; + class Z : protected Y { }; // expected-note 2 {{constrained by protected inheritance here}} + + void X::f(Z *p) { + p->field = 0; // expected-error {{cannot cast 'test4::Z' to its protected base class 'test4::X'}} expected-error {{'field' is a private member of 'test4::X'}} + } +} + // TODO: flesh out these cases |