* init.c (build_member_call): For now, don't convert to
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Apr 2002 13:59:59 +0000 (13:59 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Apr 2002 13:59:59 +0000 (13:59 +0000)
        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
gcc/cp/init.c
gcc/testsuite/g++.dg/lookup/scoped1.C [new file with mode: 0644]

index 940afa0..c0477bd 100644 (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,
 
 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>
index 5caa69c..2143af4 100644 (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);
diff --git a/gcc/testsuite/g++.dg/lookup/scoped1.C b/gcc/testsuite/g++.dg/lookup/scoped1.C
new file mode 100644 (file)
index 0000000..0fe8d33
--- /dev/null
@@ -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 *-*-* } }
+  }
+};