diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2018-09-13 21:40:38 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2018-09-13 15:40:38 -0600 |
commit | 4a426e366eccf4a8806175a18be5a13da66e0983 (patch) | |
tree | 484d1567f4a69ec82a71b1ca6a6a14b40cfb24b1 /gcc | |
parent | 84cdf51de42f823b4ed0d65ef20ab0142607917b (diff) | |
download | gcc-4a426e366eccf4a8806175a18be5a13da66e0983.zip gcc-4a426e366eccf4a8806175a18be5a13da66e0983.tar.gz gcc-4a426e366eccf4a8806175a18be5a13da66e0983.tar.bz2 |
* c-typeck.c (digest_init): Shorten overlength strings.
From-SVN: r264291
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 15 |
2 files changed, 15 insertions, 4 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 74d34b1..c28fb1c 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -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. diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 5f8df12..a7e2538 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -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)) |