summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2009-01-16 18:35:28 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2009-01-16 18:35:28 +0000
commit641db9ee09e8b03eba4cc769d31b03161826bc1a (patch)
treed4f7041a5bb0761159f40d5daad1c4d65dd1a875
parent9e5f07d35f117638fcde51b6485c5ee2b2b5b500 (diff)
downloadppe42-gcc-641db9ee09e8b03eba4cc769d31b03161826bc1a.tar.gz
ppe42-gcc-641db9ee09e8b03eba4cc769d31b03161826bc1a.zip
PR c++/38579
* search.c (protected_accessible_p): N doesn't vary. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143439 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/search.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/conversion/access1.C25
4 files changed, 40 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 306867419d8..395873ced6b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2009-01-16 Jason Merrill <jason@redhat.com>
+
+ PR c++/38579
+ * search.c (protected_accessible_p): N doesn't vary.
+
2009-01-15 Jason Merrill <jason@redhat.com>
PR c++/38850
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 7fc040bc8c4..ecc79264e11 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -721,20 +721,13 @@ protected_accessible_p (tree decl, tree derived, tree binfo)
m as a member of N is protected, and the reference occurs in a
member or friend of class N, or in a member or friend of a
- class P derived from N, where m as a member of P is private or
- protected.
-
- Here DERIVED is a possible P and DECL is m. accessible_p will
- iterate over various values of N, but the access to m in DERIVED
- does not change.
+ class P derived from N, where m as a member of P is public, private
+ or protected.
- Note that I believe that the passage above is wrong, and should read
- "...is private or protected or public"; otherwise you get bizarre results
- whereby a public using-decl can prevent you from accessing a protected
- member of a base. (jason 2000/02/28) */
+ Here DERIVED is a possible P, DECL is m and BINFO_TYPE (binfo) is N. */
- /* If DERIVED isn't derived from m's class, then it can't be a P. */
- if (!DERIVED_FROM_P (context_for_name_lookup (decl), derived))
+ /* If DERIVED isn't derived from N, then it can't be a P. */
+ if (!DERIVED_FROM_P (BINFO_TYPE (binfo), derived))
return 0;
access = access_in_type (derived, decl);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e8a3cc3e5d1..96b4ce583d7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-01-16 Jason Merrill <jason@redhat.com>
+
+ PR c++/38579
+ * g++.dg/conversion/access1.C: New test.
+
2009-01-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/38789
diff --git a/gcc/testsuite/g++.dg/conversion/access1.C b/gcc/testsuite/g++.dg/conversion/access1.C
new file mode 100644
index 00000000000..f187e63a9d3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/conversion/access1.C
@@ -0,0 +1,25 @@
+// PR c++/38579
+
+struct P
+{
+protected:
+ P() {}
+ P(const P&) {}
+};
+
+struct B : protected P
+{
+ B() {}
+};
+
+struct C : public P
+{
+ // C can access P's copy ctor, but can't convert b to const P&.
+ C(const B& b) : P(b) {} // { dg-error "inaccessible base" }
+};
+
+void foo()
+{
+ B b;
+ C c(b);
+}
OpenPOWER on IntegriCloud