aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/class.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-07-22 12:00:02 -0700
committerNathan Sidwell <nathan@acm.org>2020-07-27 13:13:32 -0700
commitb95eba48a1a25284ce7385bbfa0ee733124cb84b (patch)
tree4c1b9723d3886d37b903f94928dc2ac40c7ba65e /gcc/cp/class.c
parent07bd5544a3ab3a04d1652dbcb5a09d7271a9706a (diff)
downloadgcc-b95eba48a1a25284ce7385bbfa0ee733124cb84b.zip
gcc-b95eba48a1a25284ce7385bbfa0ee733124cb84b.tar.gz
gcc-b95eba48a1a25284ce7385bbfa0ee733124cb84b.tar.bz2
c++: Name as_base type
The as-base type never got a name. For modules I needed to give it a name to serialize properly, and it's useful when debugging the compiler, so we may as well have it on trunk. There's also a bug where its fields can have NSDMIs from the main class. This happens to be silent on trunk, but can be a GC leak where we retain a deferred parse node there. (On modules it blows up, because we're not prepared to serialize deferred parse nodes, as they should never survive parsing. gcc/cp/ * cp-tree.h (enum cp_tree_index): Add CPTI_AS_BASE_IDENTIFIER. (as_base_identifier): Define. * decl.c (initialize_predifined_identifiers): Initialize as_base identifier. * class.c (layout_class_type): Name the as-base type. Zap NSDMI its fields may have.
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r--gcc/cp/class.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index a3913f4..ba96113 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -6715,6 +6715,10 @@ layout_class_type (tree t, tree *virtuals_p)
/* T needs a different layout as a base (eliding virtual bases
or whatever). Create that version. */
tree base_t = make_node (TREE_CODE (t));
+ tree base_d = create_implicit_typedef (as_base_identifier, base_t);
+
+ TYPE_CONTEXT (base_t) = t;
+ DECL_CONTEXT (base_d) = t;
/* If the ABI version is not at least two, and the last
field was a bit-field, RLI may not be on a byte
@@ -6751,6 +6755,9 @@ layout_class_type (tree t, tree *virtuals_p)
if (TREE_CODE (field) == FIELD_DECL)
{
*next_field = copy_node (field);
+ /* Zap any NSDMI, it's not needed and might be a deferred
+ parse. */
+ DECL_INITIAL (*next_field) = NULL_TREE;
DECL_CONTEXT (*next_field) = base_t;
next_field = &DECL_CHAIN (*next_field);
}
@@ -6760,8 +6767,6 @@ layout_class_type (tree t, tree *virtuals_p)
needs a mode. */
compute_record_mode (base_t);
- TYPE_CONTEXT (base_t) = t;
-
/* Record the base version of the type. */
CLASSTYPE_AS_BASE (t) = base_t;
}