Hi,

this is the complete patch, tested x86_64-linux.

Thanks, Paolo.

////////////////////////

/c-family
2018-01-25  Paolo Carlini  <paolo.carl...@oracle.com>

        * c-common.h (DECL_UNNAMED_BIT_FIELD): New.

/c
2018-01-25  Paolo Carlini  <paolo.carl...@oracle.com>

        * c-typeck.c (really_start_incremental_init, push_init_level,
        set_nonincremental_init, output_init_element, process_init_element):
        Use DECL_UNNAMED_BIT_FIELD.

/cp
2018-01-25  Paolo Carlini  <paolo.carl...@oracle.com>

        * class.c (is_really_empty_class): Use DECL_UNNAMED_BIT_FIELD.
        * constexpr.c (cx_check_missing_mem_inits): Likewise.
        * decl.c (next_initializable_field, find_decomp_class_base,
        cp_finish_decomp): Likewise.
        * typeck2.c (process_init_constructor_record): Likewise.
Index: c/c-typeck.c
===================================================================
--- c/c-typeck.c        (revision 257063)
+++ c/c-typeck.c        (working copy)
@@ -7955,8 +7955,7 @@ really_start_incremental_init (tree type)
       constructor_fields = TYPE_FIELDS (constructor_type);
       /* Skip any nameless bit fields at the beginning.  */
       while (constructor_fields != NULL_TREE
-            && DECL_C_BIT_FIELD (constructor_fields)
-            && DECL_NAME (constructor_fields) == NULL_TREE)
+            && DECL_UNNAMED_BIT_FIELD (constructor_fields))
        constructor_fields = DECL_CHAIN (constructor_fields);
 
       constructor_unfilled_fields = constructor_fields;
@@ -8161,8 +8160,7 @@ push_init_level (location_t loc, int implicit,
       constructor_fields = TYPE_FIELDS (constructor_type);
       /* Skip any nameless bit fields at the beginning.  */
       while (constructor_fields != NULL_TREE
-            && DECL_C_BIT_FIELD (constructor_fields)
-            && DECL_NAME (constructor_fields) == NULL_TREE)
+            && DECL_UNNAMED_BIT_FIELD (constructor_fields))
        constructor_fields = DECL_CHAIN (constructor_fields);
 
       constructor_unfilled_fields = constructor_fields;
@@ -8930,8 +8928,7 @@ set_nonincremental_init (struct obstack * braced_i
       constructor_unfilled_fields = TYPE_FIELDS (constructor_type);
       /* Skip any nameless bit fields at the beginning.  */
       while (constructor_unfilled_fields != NULL_TREE
-            && DECL_C_BIT_FIELD (constructor_unfilled_fields)
-            && DECL_NAME (constructor_unfilled_fields) == NULL_TREE)
+            && DECL_UNNAMED_BIT_FIELD (constructor_unfilled_fields))
        constructor_unfilled_fields = TREE_CHAIN (constructor_unfilled_fields);
 
     }
@@ -9300,8 +9297,7 @@ output_init_element (location_t loc, tree value, t
 
       /* Skip any nameless bit fields.  */
       while (constructor_unfilled_fields != NULL_TREE
-            && DECL_C_BIT_FIELD (constructor_unfilled_fields)
-            && DECL_NAME (constructor_unfilled_fields) == NULL_TREE)
+            && DECL_UNNAMED_BIT_FIELD (constructor_unfilled_fields))
        constructor_unfilled_fields =
          DECL_CHAIN (constructor_unfilled_fields);
     }
@@ -9665,8 +9661,8 @@ process_init_element (location_t loc, struct c_exp
                  constructor_unfilled_fields = DECL_CHAIN (constructor_fields);
                  /* Skip any nameless bit fields.  */
                  while (constructor_unfilled_fields != 0
-                        && DECL_C_BIT_FIELD (constructor_unfilled_fields)
-                        && DECL_NAME (constructor_unfilled_fields) == 0)
+                        && (DECL_UNNAMED_BIT_FIELD
+                            (constructor_unfilled_fields)))
                    constructor_unfilled_fields =
                      DECL_CHAIN (constructor_unfilled_fields);
                }
@@ -9675,8 +9671,7 @@ process_init_element (location_t loc, struct c_exp
          constructor_fields = DECL_CHAIN (constructor_fields);
          /* Skip any nameless bit fields at the beginning.  */
          while (constructor_fields != NULL_TREE
-                && DECL_C_BIT_FIELD (constructor_fields)
-                && DECL_NAME (constructor_fields) == NULL_TREE)
+                && DECL_UNNAMED_BIT_FIELD (constructor_fields))
            constructor_fields = DECL_CHAIN (constructor_fields);
        }
       else if (TREE_CODE (constructor_type) == UNION_TYPE)
Index: c-family/c-common.h
===================================================================
--- c-family/c-common.h (revision 257063)
+++ c-family/c-common.h (working copy)
@@ -939,6 +939,10 @@ extern void c_parse_final_cleanups (void);
 #define CLEAR_DECL_C_BIT_FIELD(NODE) \
   (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 0)
 
+/* True if the decl was an unnamed bitfield.  */
+#define DECL_UNNAMED_BIT_FIELD(NODE) \
+  (DECL_C_BIT_FIELD (NODE) && !DECL_NAME (NODE))
+
 extern tree do_case (location_t, tree, tree);
 extern tree build_stmt (location_t, enum tree_code, ...);
 extern tree build_real_imag_expr (location_t, enum tree_code, tree);
Index: cp/class.c
===================================================================
--- cp/class.c  (revision 257063)
+++ cp/class.c  (working copy)
@@ -8202,7 +8202,7 @@ is_really_empty_class (tree type)
        if (TREE_CODE (field) == FIELD_DECL
            && !DECL_ARTIFICIAL (field)
            /* An unnamed bit-field is not a data member.  */
-           && (DECL_NAME (field) || !DECL_C_BIT_FIELD (field))
+           && !DECL_UNNAMED_BIT_FIELD (field)
            && !is_really_empty_class (TREE_TYPE (field)))
          return false;
       return true;
Index: cp/constexpr.c
===================================================================
--- cp/constexpr.c      (revision 257063)
+++ cp/constexpr.c      (working copy)
@@ -783,7 +783,7 @@ cx_check_missing_mem_inits (tree ctype, tree body,
          tree ftype;
          if (TREE_CODE (field) != FIELD_DECL)
            continue;
-         if (DECL_C_BIT_FIELD (field) && !DECL_NAME (field))
+         if (DECL_UNNAMED_BIT_FIELD (field))
            continue;
          if (DECL_ARTIFICIAL (field))
            continue;
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 257063)
+++ cp/decl.c   (working copy)
@@ -5634,7 +5634,7 @@ next_initializable_field (tree field)
 {
   while (field
         && (TREE_CODE (field) != FIELD_DECL
-            || (DECL_C_BIT_FIELD (field) && !DECL_NAME (field))
+            || DECL_UNNAMED_BIT_FIELD (field)
             || (DECL_ARTIFICIAL (field)
                 && !(cxx_dialect >= cxx17 && DECL_FIELD_IS_BASE (field)))))
     field = DECL_CHAIN (field);
@@ -7208,7 +7208,7 @@ find_decomp_class_base (location_t loc, tree type,
   for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
     if (TREE_CODE (field) != FIELD_DECL
        || DECL_ARTIFICIAL (field)
-       || (DECL_C_BIT_FIELD (field) && !DECL_NAME (field)))
+       || DECL_UNNAMED_BIT_FIELD (field))
       continue;
     else if (ret)
       return type;
@@ -7646,7 +7646,7 @@ cp_finish_decomp (tree decl, tree first, unsigned
       for (tree field = TYPE_FIELDS (btype); field; field = TREE_CHAIN (field))
        if (TREE_CODE (field) != FIELD_DECL
            || DECL_ARTIFICIAL (field)
-           || (DECL_C_BIT_FIELD (field) && !DECL_NAME (field)))
+           || DECL_UNNAMED_BIT_FIELD (field))
          continue;
        else
          eltscnt++;
@@ -7663,7 +7663,7 @@ cp_finish_decomp (tree decl, tree first, unsigned
       for (tree field = TYPE_FIELDS (btype); field; field = TREE_CHAIN (field))
        if (TREE_CODE (field) != FIELD_DECL
            || DECL_ARTIFICIAL (field)
-           || (DECL_C_BIT_FIELD (field) && !DECL_NAME (field)))
+           || DECL_UNNAMED_BIT_FIELD (field))
          continue;
        else
          {
Index: cp/typeck2.c
===================================================================
--- cp/typeck2.c        (revision 257063)
+++ cp/typeck2.c        (working copy)
@@ -1395,14 +1395,14 @@ process_init_constructor_record (tree type, tree i
       tree next;
       tree type;
 
-      if (!DECL_NAME (field) && DECL_C_BIT_FIELD (field))
-       continue;
-
       if (TREE_CODE (field) != FIELD_DECL
          || (DECL_ARTIFICIAL (field)
              && !(cxx_dialect >= cxx17 && DECL_FIELD_IS_BASE (field))))
        continue;
 
+      if (DECL_UNNAMED_BIT_FIELD (field))
+       continue;
+
       /* If this is a bitfield, first convert to the declared type.  */
       type = TREE_TYPE (field);
       if (DECL_BIT_FIELD_TYPE (field))
@@ -1547,8 +1547,6 @@ process_init_constructor_record (tree type, tree i
              for (field = TYPE_FIELDS (type);
                   field; field = DECL_CHAIN (field))
                {
-                 if (!DECL_NAME (field) && DECL_C_BIT_FIELD (field))
-                   continue;
                  if (TREE_CODE (field) != FIELD_DECL
                      || (DECL_ARTIFICIAL (field)
                          && !(cxx_dialect >= cxx17
@@ -1555,6 +1553,9 @@ process_init_constructor_record (tree type, tree i
                               && DECL_FIELD_IS_BASE (field))))
                    continue;
 
+                 if (DECL_UNNAMED_BIT_FIELD (field))
+                   continue;
+
                  if (ce->index == field || ce->index == DECL_NAME (field))
                    break;
                  if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))

Reply via email to