PATCH for g++ (protected member access check fix)

Mike Stump mrs@wrs.com
Thu Apr 30 20:03:00 GMT 1998


Thu Apr 30 17:25:06 1998  Mike Stump  <mrs@wrs.com>

	* init.c (resolve_offset_ref): We must use basetype_path before we
	destroy it with a call to convert_pointer_to.

Doing diffs in cp/init.c.~1~:
*** cp/init.c.~1~	Fri Apr 10 14:07:50 1998
--- cp/init.c	Thu Apr 30 17:22:45 1998
*************** resolve_offset_ref (exp)
*** 1880,1887 ****
  	  error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
  	  return error_mark_node;
  	}
-       addr = convert_pointer_to (basetype, base);
        access = compute_access (basetype_path, member);
        if (access == access_public_node)
  	return build (COMPONENT_REF, TREE_TYPE (member),
  		      build_indirect_ref (addr, NULL_PTR), member);
--- 1880,1887 ----
  	  error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base)));
  	  return error_mark_node;
  	}
        access = compute_access (basetype_path, member);
+       addr = convert_pointer_to (basetype, base);
        if (access == access_public_node)
  	return build (COMPONENT_REF, TREE_TYPE (member),
  		      build_indirect_ref (addr, NULL_PTR), member);
--------------
Doing diffs in testsuite/g++.old-deja/g++.mike:
*** testsuite/g++.old-deja/g++.mike/s9959.C.~1~	Thu Apr 30 17:39:06 1998
--- testsuite/g++.old-deja/g++.mike/s9959.C	Thu Apr 30 17:38:57 1998
***************
*** 0 ****
--- 1,20 ----
+ // Build don't link:
+ 
+ class A {
+ protected:
+   int aData;
+ };
+  
+ class B : public A {
+ public:
+   virtual void func1() { 
+     A::aData = 1;
+   }
+ };
+ 
+ class C : virtual public B {
+ public:
+   virtual void func1(void) {
+     A::aData = 2;
+   }
+ };
--------------



More information about the Gcc mailing list