varasm.c (output_constructor_regular_field): Check TYPE_SIZE_UNIT of the init value.
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Thu, 6 Sep 2018 15:39:48 +0000 (15:39 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 6 Sep 2018 15:39:48 +0000 (09:39 -0600)
* varasm.c (output_constructor_regular_field): Check TYPE_SIZE_UNIT of
the init value.

* c-common.c (complete_flexible_array_elts): New helper function.
* c-common.h (complete_flexible_array_elts): Declare.

* c-decl.c (finish_decl): Call complete_flexible_array_elts.

* decl.c (check_initializer): Call cp_complete_array_type.

From-SVN: r264147

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/varasm.c

index 19800f5930b5ff3e7caaa51a48c6aafc66b8a8ad..f8fedba6171098ba420234f8c0a7b9e29013126d 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * varasm.c (output_constructor_regular_field): Check TYPE_SIZE_UNIT of
+       the init value.
+
 2018-09-06  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        * config/rs6000/rs6000.c (rs6000_gimple_fold_builtin): Add support for
index 4129f244cd54d60f2b6b73ea177f70e4ba5913b3..75064a2b684d57fbe0f4cd177557f9882b6d4148 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * c-common.c (complete_flexible_array_elts): New helper function.
+       * c-common.h (complete_flexible_array_elts): Declare.
+
 2018-09-02  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * c-common.c (braced_list_to_string): Remove eval parameter.
index 13ed65cb0127a1479849f6b3eae9621c7c6f7f0f..4bfb14585e2a5543c8a9980c46fdf3fd7b8fed59 100644 (file)
@@ -6425,6 +6425,28 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default)
   return failure;
 }
 
+/* INIT is an constructor of a structure with a flexible array member.
+   Complete the flexible array member with a domain based on it's value.  */
+void
+complete_flexible_array_elts (tree init)
+{
+  tree elt, type;
+
+  if (init == NULL_TREE || TREE_CODE (init) != CONSTRUCTOR)
+    return;
+
+  if (vec_safe_is_empty (CONSTRUCTOR_ELTS (init)))
+    return;
+
+  elt = CONSTRUCTOR_ELTS (init)->last ().value;
+  type = TREE_TYPE (elt);
+  if (TREE_CODE (type) == ARRAY_TYPE
+      && TYPE_SIZE (type) == NULL_TREE)
+    complete_array_type (&TREE_TYPE (elt), elt, false);
+  else
+    complete_flexible_array_elts (elt);
+}
+
 /* Like c_mark_addressable but don't check register qualifier.  */
 void 
 c_common_mark_addressable_vec (tree t)
index cc168e22c6bed1697cd350a6a9856b5df918c4b2..9e868768d011f05c56382f6bcda0a965f0bff66f 100644 (file)
@@ -1038,6 +1038,7 @@ extern tree fold_offsetof (tree, tree = size_type_node,
                           tree_code ctx = ERROR_MARK);
 
 extern int complete_array_type (tree *, tree, bool);
+extern void complete_flexible_array_elts (tree);
 
 extern tree builtin_type_for_size (int, bool);
 
index 5c18f6307f80e0e37a17e856a1d4e7d6c9e4d902..74d34b1ddb000c8cc2bb4fa60bc49408064a4679 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * c-decl.c (finish_decl): Call complete_flexible_array_elts.
+
 2018-09-02  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * c-decl.c (finish_decl): Call braced_list_to_string here ...
index fd08d72b11f484c246bfdbbd42d4ee31298c74b0..fdcfbde2d993b2ef01f563870e0aa23d13bc00da 100644 (file)
@@ -5042,6 +5042,8 @@ finish_decl (tree decl, location_t init_loc, tree init,
       if (init && TREE_CODE (init) == CONSTRUCTOR)
        add_flexible_array_elts_to_size (decl, init);
 
+      complete_flexible_array_elts (DECL_INITIAL (decl));
+
       if (DECL_SIZE (decl) == NULL_TREE && TREE_TYPE (decl) != error_mark_node
          && COMPLETE_TYPE_P (TREE_TYPE (decl)))
        layout_decl (decl, 0);
index d5879f8cd0ed8d4303bf6cfde9171d9c72b7e5d9..42e70cdbe25bd1ca9e9e6d31d88a6939629f5e37 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * decl.c (check_initializer): Call cp_complete_array_type.
+
 2018-09-05  Marek Polacek  <polacek@redhat.com>
 
        PR c++/87109, wrong overload with ref-qualifiers.
index 5962c19fbe4be374cf6cf05b2a0898100bed5bcc..50b60e89df50803222339ed5a1b8ac91af709c3d 100644 (file)
@@ -6478,6 +6478,16 @@ check_initializer (tree decl, tree init, int flags, vec<tree, va_gc> **cleanups)
 
          init_code = store_init_value (decl, init, cleanups, flags);
 
+         if (DECL_INITIAL (decl)
+             && TREE_CODE (DECL_INITIAL (decl)) == CONSTRUCTOR
+             && !vec_safe_is_empty (CONSTRUCTOR_ELTS (DECL_INITIAL (decl))))
+           {
+             tree elt = CONSTRUCTOR_ELTS (DECL_INITIAL (decl))->last ().value;
+             if (TREE_CODE (TREE_TYPE (elt)) == ARRAY_TYPE
+                 && TYPE_SIZE (TREE_TYPE (elt)) == NULL_TREE)
+               cp_complete_array_type (&TREE_TYPE (elt), elt, false);
+           }
+
          if (pedantic && TREE_CODE (type) == ARRAY_TYPE
              && DECL_INITIAL (decl)
              && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST
index 2180da48895827967bc902fba604fc5c69478885..27d878f218a73f50e2ea803a2023ebfe635ec686 100644 (file)
@@ -5160,6 +5160,8 @@ output_constructor_regular_field (oc_local_state *local)
             on the chain is a TYPE_DECL of the enclosing struct.  */
          const_tree next = DECL_CHAIN (local->field);
          gcc_assert (!fieldsize || !next || TREE_CODE (next) != FIELD_DECL);
+         tree size = TYPE_SIZE_UNIT (TREE_TYPE (local->val));
+         gcc_checking_assert (compare_tree_int (size, fieldsize) == 0);
        }
       else
        fieldsize = tree_to_uhwi (DECL_SIZE_UNIT (local->field));