aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2019-10-18 12:46:01 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2019-10-18 12:46:01 +0000
commit638ba8121dd2042469c4b0051539c6bb8d3a5845 (patch)
tree35bd626800d5cc9548b6d6bddd2ca2dfdbb19c0c
parent7c929c9c611546f0e77753e90b652f7607d06484 (diff)
downloadgcc-638ba8121dd2042469c4b0051539c6bb8d3a5845.zip
gcc-638ba8121dd2042469c4b0051539c6bb8d3a5845.tar.gz
gcc-638ba8121dd2042469c4b0051539c6bb8d3a5845.tar.bz2
[C++ PATCH] anon type names
https://gcc.gnu.org/ml/gcc-patches/2019-10/msg01354.html I noticed that we use a bitfield flag to note types with names for linkage purposes: typedef struct {} foo; but, we can infer this by comparing TYPE_STUB_DECL and TYPE_DECL of the main variant. It's only checked in two places -- the C++ parser and the objective C++ encoder. * cp-tree.h (struct lang_type): Remove was_anonymous. (TYPE_WAS_UNNAMED): Implement by checking TYPE_DECL & TYPE_STUB_DECL. * decl.c (name_unnamed_type): Don't set TYPE_WAS_UNNAMED. From-SVN: r277155
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-tree.h15
-rw-r--r--gcc/cp/decl.c3
3 files changed, 16 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d07a5e5..ba533d5f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2019-10-18 Nathan Sidwell <nathan@acm.org>
+
+ * cp-tree.h (struct lang_type): Remove was_anonymous.
+ (TYPE_WAS_UNNAMED): Implement by checking TYPE_DECL &
+ TYPE_STUB_DECL.
+ * decl.c (name_unnamed_type): Don't set TYPE_WAS_UNNAMED.
+
2019-10-17 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (grokfndecl): Remove redundant use of in_system_header_at.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 663d84b..8c11ac5 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -2152,7 +2152,6 @@ struct GTY(()) lang_type {
unsigned fields_readonly : 1;
unsigned ptrmemfunc_flag : 1;
- unsigned was_anonymous : 1;
unsigned lazy_default_ctor : 1;
unsigned lazy_copy_ctor : 1;
unsigned lazy_copy_assign : 1;
@@ -2160,8 +2159,8 @@ struct GTY(()) lang_type {
unsigned has_const_copy_ctor : 1;
unsigned has_complex_copy_ctor : 1;
unsigned has_complex_copy_assign : 1;
-
unsigned non_aggregate : 1;
+
unsigned has_complex_dflt : 1;
unsigned has_list_ctor : 1;
unsigned non_std_layout : 1;
@@ -2169,8 +2168,8 @@ struct GTY(()) lang_type {
unsigned lazy_move_ctor : 1;
unsigned lazy_move_assign : 1;
unsigned has_complex_move_ctor : 1;
-
unsigned has_complex_move_assign : 1;
+
unsigned has_constexpr_ctor : 1;
unsigned unique_obj_representations : 1;
unsigned unique_obj_representations_set : 1;
@@ -2182,7 +2181,7 @@ struct GTY(()) lang_type {
/* There are some bits left to fill out a 32-bit word. Keep track
of this by updating the size of this bitfield whenever you add or
remove a flag. */
- unsigned dummy : 4;
+ unsigned dummy : 5;
tree primary_base;
vec<tree_pair_s, va_gc> *vcall_indices;
@@ -4585,8 +4584,12 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
/* Define fields and accessors for nodes representing declared names. */
-/* Nonzero if TYPE is an unnamed class with a typedef for linkage purposes. */
-#define TYPE_WAS_UNNAMED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->was_anonymous)
+/* True if TYPE is an unnamed structured type with a typedef for
+ linkage purposes. In that case TYPE_NAME and TYPE_STUB_DECL of the
+ MAIN-VARIANT are different. */
+#define TYPE_WAS_UNNAMED(NODE) \
+ (TYPE_NAME (TYPE_MAIN_VARIANT (NODE)) \
+ != TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 35fa9e9..52f1f02 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10441,9 +10441,6 @@ name_unnamed_type (tree type, tree decl)
/*debug_hooks->set_name (t, decl);*/
TYPE_NAME (t) = decl;
- if (TYPE_LANG_SPECIFIC (type))
- TYPE_WAS_UNNAMED (type) = 1;
-
/* If this is a typedef within a template class, the nested
type is a (non-primary) template. The name for the
template needs updating as well. */