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