This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[c++] fixed_type_or_null bug
- From: Richard Henderson <rth at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Date: Thu, 26 Aug 2004 03:20:31 -0700
- Subject: [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]. */