aboutsummaryrefslogtreecommitdiff
path: root/test/CXX/class.access/class.access.base/p5.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2013-02-27 00:08:19 +0000
committerJohn McCall <rjmccall@apple.com>2013-02-27 00:08:19 +0000
commit714b509bb4f8be76e6616944551efe7a6e8358cd (patch)
tree4ffab68380a73be779156880f19be34bc5679c8d /test/CXX/class.access/class.access.base/p5.cpp
parent899245792776dd219a3c36eb19b42272e270bc0c (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.cpp23
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