From c8453490f7995ca56ed6762174aab0cfbb23b736 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 9 Apr 2002 13:59:59 +0000 Subject: [PATCH] * init.c (build_member_call): For now, don't convert to intermediate base if it would cause an error. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52078 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 9 +++++++-- gcc/cp/init.c | 6 +++++- gcc/testsuite/g++.dg/lookup/scoped1.C | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/scoped1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 940afa0..c0477bd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2002-04-09 Jason Merrill + + * init.c (build_member_call): For now, don't convert to + intermediate base if it would cause an error. + 2002-04-08 Paolo Carlini * parse.y (namespace_qualifier, maybe_identifier, @@ -276,8 +281,8 @@ 2002-03-22 Jeff Knaggs - * typeck.c (expand_ptrmemfunc_cst): Scale idx down to an index - into the vtable_entry array regardless of + * typeck.c (get_member_function_from_ptrfunc): Scale idx down to + an index into the vtable_entry array regardless of TARGET_PTRMEMFUNC_VBIT_LOCATION. 2002-03-21 Aldy Hernandez diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 5caa69c..2143af4 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1497,7 +1497,11 @@ build_member_call (type, name, parmlist) /* Convert 'this' to the specified type to disambiguate conversion to the function's context. */ - if (decl == current_class_ref) + if (decl == current_class_ref + /* ??? this is wrong, but if this conversion is invalid we need to + defer it until we know whether we are calling a static or + non-static member function. Be conservative for now. */ + && ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type)) { basetype_path = NULL_TREE; decl = build_scoped_ref (decl, type, &basetype_path); diff --git a/gcc/testsuite/g++.dg/lookup/scoped1.C b/gcc/testsuite/g++.dg/lookup/scoped1.C new file mode 100644 index 0000000..0fe8d33 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped1.C @@ -0,0 +1,22 @@ +// Test that explicitly scoped references to static members work even if +// they belong to an inaccessible base. + +struct A +{ + static int i1; + int i2; + static void f1 (); + void f2 (); +}; + +struct B: private A { }; +struct C: public B +{ + void g () + { + ::A::i1 = 1; + ::A::i2 = 1; // { dg-error "access" "" } + ::A::f1 (); + ::A::f2 (); // { dg-error "access" "" { xfail *-*-* } } + } +}; -- 2.7.4