From 1ceb2263cf6a4e682709c2a8eb38b348943e99dd Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 16 Jan 2009 13:35:28 -0500 Subject: [PATCH] re PR c++/38579 (Template: Wrong inherited copy-ctor visibility) PR c++/38579 * search.c (protected_accessible_p): N doesn't vary. From-SVN: r143439 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/search.c | 17 +++++---------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/conversion/access1.C | 25 +++++++++++++++++++++++ 4 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/conversion/access1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 306867419d86..395873ced6b9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2009-01-16 Jason Merrill + + PR c++/38579 + * search.c (protected_accessible_p): N doesn't vary. + 2009-01-15 Jason Merrill PR c++/38850 diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 7fc040bc8c47..ecc79264e114 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 e8a3cc3e5d15..96b4ce583d73 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-16 Jason Merrill + + PR c++/38579 + * g++.dg/conversion/access1.C: New test. + 2009-01-16 Jakub Jelinek 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 000000000000..f187e63a9d3d --- /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); +} -- 2.47.2