* c-typeck.c (digest_init): Shorten overlength strings.
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Thu, 13 Sep 2018 21:40:38 +0000 (21:40 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 13 Sep 2018 21:40:38 +0000 (15:40 -0600)
From-SVN: r264291

gcc/c/ChangeLog
gcc/c/c-typeck.c

index 74d34b1ddb000c8cc2bb4fa60bc49408064a4679..c28fb1c0ebc7232345d2413baf36ca0f61ddff4b 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-13  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * c-typeck.c (digest_init): Shorten overlength strings.
+
 2018-09-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * c-decl.c (finish_decl): Call complete_flexible_array_elts.
index 5f8df12564d00b39e99ef7e4976b50da3a578a35..a7e2538e1ac9cb68f6dfa4f418e3dbbe0d9736fd 100644 (file)
@@ -7485,19 +7485,17 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype,
                }
            }
 
-         TREE_TYPE (inside_init) = type;
          if (TYPE_DOMAIN (type) != NULL_TREE
              && TYPE_SIZE (type) != NULL_TREE
              && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
            {
              unsigned HOST_WIDE_INT len = TREE_STRING_LENGTH (inside_init);
+             unsigned unit = TYPE_PRECISION (typ1) / BITS_PER_UNIT;
 
              /* Subtract the size of a single (possibly wide) character
                 because it's ok to ignore the terminating null char
                 that is counted in the length of the constant.  */
-             if (compare_tree_int (TYPE_SIZE_UNIT (type),
-                                   (len - (TYPE_PRECISION (typ1)
-                                           / BITS_PER_UNIT))) < 0)
+             if (compare_tree_int (TYPE_SIZE_UNIT (type), len - unit) < 0)
                pedwarn_init (init_loc, 0,
                              ("initializer-string for array of chars "
                               "is too long"));
@@ -7506,8 +7504,17 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype,
                warning_at (init_loc, OPT_Wc___compat,
                            ("initializer-string for array chars "
                             "is too long for C++"));
+             if (compare_tree_int (TYPE_SIZE_UNIT (type), len) < 0)
+               {
+                 unsigned HOST_WIDE_INT size
+                   = tree_to_uhwi (TYPE_SIZE_UNIT (type));
+                 const char *p = TREE_STRING_POINTER (inside_init);
+
+                 inside_init = build_string (size, p);
+               }
            }
 
+         TREE_TYPE (inside_init) = type;
          return inside_init;
        }
       else if (INTEGRAL_TYPE_P (typ1))