cp-tree.h (DECL_FIELD_IS_BASE): New.
authorRichard Henderson <rth@redhat.com>
Thu, 26 Aug 2004 18:07:57 +0000 (11:07 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 26 Aug 2004 18:07:57 +0000 (11:07 -0700)
        * 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.

From-SVN: r86630

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h

index ec071ae745aeba0fce8c4f4a10751e072003d279..ac5344eddc168f5f09eeb289aeaf74990921507d 100644 (file)
@@ -1,3 +1,10 @@
+2004-08-26  Richard Henderson  <rth@redhat.com>
+
+       * 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.
+
 2004-08-25  Roger Sayle  <roger@eyesopen.com>
 
        PR middle-end/16693
index bd0d3f5523e01fc30a44e7289951c688aa3e758a..d6115b4fb28eaa19d21f33f0206e5670e2868fcf 100644 (file)
@@ -438,9 +438,8 @@ build_simple_base_path (tree expr, tree binfo)
        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, tree binfo,
       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* nonnull, int* cdtorp)
       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 d7b44485d734d30e3a5ebc9dc15c17f8a25711c5..4597b45ff81c3aa169466d13fe5765e6639d11b9 100644 (file)
@@ -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].  */