diff options
| author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-01-16 18:35:28 +0000 |
|---|---|---|
| committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-01-16 18:35:28 +0000 |
| commit | 641db9ee09e8b03eba4cc769d31b03161826bc1a (patch) | |
| tree | d4f7041a5bb0761159f40d5daad1c4d65dd1a875 | |
| parent | 9e5f07d35f117638fcde51b6485c5ee2b2b5b500 (diff) | |
| download | ppe42-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/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/cp/search.c | 17 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/conversion/access1.C | 25 |
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); +} |

