[C++ PATCH] anon type names
authorNathan Sidwell <nathan@acm.org>
Fri, 18 Oct 2019 12:46:01 +0000 (12:46 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 18 Oct 2019 12:46:01 +0000 (12:46 +0000)
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

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

index d07a5e59eb83f57326920e138a1636b20e2b2724..ba533d5fb95b55fa9ba0690a27933268edd1a07e 100644 (file)
@@ -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.
index 663d84b2a58e010b4cc5d2d1426a29626b550559..8c11ac5dd356bf17eebc2d08dc5ab1b95d2c89b7 100644 (file)
@@ -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.  */
 
index 35fa9e92aa57d3945c55874bc7991987a5054ea2..52f1f020dc3594fabb044bb5fc112933961f05a0 100644 (file)
@@ -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.  */