diff options
author | Richard Henderson <rth@redhat.com> | 2004-08-26 11:07:57 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-08-26 11:07:57 -0700 |
commit | 642124c6357309ef8921518244c03ca7551889fc (patch) | |
tree | 4a6cbb2f40bd42b9a901fdcd8597394936704ff9 /gcc/cp/class.c | |
parent | 2e6c96419d34a2921e746e14facbb403e2cf06ee (diff) | |
download | gcc-642124c6357309ef8921518244c03ca7551889fc.zip gcc-642124c6357309ef8921518244c03ca7551889fc.tar.gz gcc-642124c6357309ef8921518244c03ca7551889fc.tar.bz2 |
cp-tree.h (DECL_FIELD_IS_BASE): New.
* 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
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r-- | gcc/cp/class.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index bd0d3f5..d6115b4 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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: |