aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2018-09-13 21:40:38 +0000
committerJeff Law <law@gcc.gnu.org>2018-09-13 15:40:38 -0600
commit4a426e366eccf4a8806175a18be5a13da66e0983 (patch)
tree484d1567f4a69ec82a71b1ca6a6a14b40cfb24b1 /gcc
parent84cdf51de42f823b4ed0d65ef20ab0142607917b (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/c/c-typeck.c15
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))