This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[c++] fixed_type_or_null bug


Fields defined by the user are (or may be) definitive about the type.
Base fields introduced by the compiler never are; that information is
still dependent on how we've arrived at the current class.

This bug would have been introduced in your base field reorg, Jason.
I discovered it working on doing the right thing with "&a->b".  I
wonder if some of the oddities in Andrew Pinski's patch had something
to do with this.  Not bothering to check since I've got my own
implementation.  ;-)

Ok?


r~



	* cp-tree.h (DECL_FIELD_IS_BASE): New.
	* class.c (build_base_field): Set it.
	(build_simple_base_path): Use it.
	(fixed_type_or_null): Don't consider base fields definitive.

Index: class.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/class.c,v
retrieving revision 1.658
diff -u -p -r1.658 class.c
--- class.c	25 Aug 2004 09:52:29 -0000	1.658
+++ class.c	26 Aug 2004 10:13:28 -0000
@@ -438,9 +438,8 @@ build_simple_base_path (tree expr, tree 
        field; field = TREE_CHAIN (field))
     /* Is this the base field created by build_base_field?  */
     if (TREE_CODE (field) == FIELD_DECL
-	&& TREE_TYPE (field) == type
-	&& DECL_ARTIFICIAL (field)
-	&& DECL_IGNORED_P (field))
+	&& DECL_FIELD_IS_BASE (field)
+	&& TREE_TYPE (field) == type)
       return build_class_member_access_expr (expr, field,
 					     NULL_TREE, false);
 
@@ -3642,6 +3641,7 @@ build_base_field (record_layout_info rli
       DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
       DECL_USER_ALIGN (decl) = CLASSTYPE_USER_ALIGN (basetype);
       DECL_IGNORED_P (decl) = 1;
+      DECL_FIELD_IS_BASE (decl) = 1;
 
       /* Try to place the field.  It may take more than one try if we
 	 have a hard time placing the field without putting two
@@ -5300,6 +5300,10 @@ fixed_type_or_null (tree instance, int* 
       return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull, cdtorp);
 
     case COMPONENT_REF:
+      /* If this component is really a base class reference, then the field
+	 itself isn't definitive.  */
+      if (DECL_FIELD_IS_BASE (TREE_OPERAND (instance, 1)))
+        return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull, cdtorp);
       return fixed_type_or_null (TREE_OPERAND (instance, 1), nonnull, cdtorp);
 
     case VAR_DECL:
Index: cp-tree.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/cp-tree.h,v
retrieving revision 1.1034
diff -u -p -r1.1034 cp-tree.h
--- cp-tree.h	25 Aug 2004 16:58:22 -0000	1.1034
+++ cp-tree.h	26 Aug 2004 10:13:28 -0000
@@ -100,6 +100,7 @@ struct diagnostic_context;
       DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL)
    5: DECL_INTERFACE_KNOWN.
    6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL).
+      DECL_FIELD_IS_BASE (in FIELD_DECL)
    7: DECL_DEAD_FOR_LOCAL (in VAR_DECL).
       DECL_THUNK_P (in a member FUNCTION_DECL)
 
@@ -2550,6 +2551,11 @@ struct lang_decl GTY(())
 #define DECL_THIS_STATIC(NODE) \
   DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
 
+/* Nonzero for FIELD_DECL node means that this field is a base class
+   of the parent object, as opposed to a member field.  */
+#define DECL_FIELD_IS_BASE(NODE) \
+  DECL_LANG_FLAG_6 (FIELD_DECL_CHECK (NODE))
+
 /* Nonzero if TYPE is an anonymous union or struct type.  We have to use a
    flag for this because "A union for which objects or pointers are
    declared is not an anonymous union" [class.union].  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]