init.c (build_member_call): For now, don't convert to intermediate base if it would cause an error.

* init.c (build_member_call): For now, don't convert to
        intermediate base if it would cause an error.

From-SVN: r52078
This commit is contained in:
Jason Merrill 2002-04-09 09:59:59 -04:00
parent 1ce7f3c2ab
commit cd6af0c13a
3 changed files with 34 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2002-04-09 Jason Merrill <jason@redhat.com>
* init.c (build_member_call): For now, don't convert to
intermediate base if it would cause an error.
2002-04-08 Paolo Carlini <pcarlini@unitus.it>
* parse.y (namespace_qualifier, maybe_identifier,
@ -276,8 +281,8 @@
2002-03-22 Jeff Knaggs <jknaggs@redhat.com>
* 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 <aldyh@redhat.com>

View File

@ -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);

View File

@ -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 *-*-* } }
}
};