[C++] Add DECL_UNNAMED_BIT_FIELD and use it

Message ID 16a5879e-ddba-7506-b86c-c7e5745b0f3f@oracle.com
State New
Headers show
Series
  • [C++] Add DECL_UNNAMED_BIT_FIELD and use it
Related show

Commit Message

Paolo Carlini Jan. 25, 2018, 9:04 p.m.
Hi,

this is the complete patch, tested x86_64-linux.

Thanks, Paolo.

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

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

/c
2018-01-25  Paolo Carlini  <paolo.carlini@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.carlini@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.

Comments

Jason Merrill Feb. 2, 2018, 7:12 p.m. | #1
OK.

On Thu, Jan 25, 2018 at 4:04 PM, Paolo Carlini <paolo.carlini@oracle.com> wrote:
> Hi,

>

> this is the complete patch, tested x86_64-linux.

>

> Thanks, Paolo.

>

> ////////////////////////

>

Patch

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)))