aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam James <sam@gentoo.org>2024-10-28 21:32:18 +0000
committerSam James <sam@gentoo.org>2024-10-28 21:32:18 +0000
commita0691e3578dcab1c745e963bb4f9ffe2a3889cf3 (patch)
tree128f26c45d39715d0578184ca1de9ad4d37cb7f6
parent15.0.0: cut patchset 20 (diff)
downloadgcc-patches-a0691e3578dcab1c745e963bb4f9ffe2a3889cf3.tar.gz
gcc-patches-a0691e3578dcab1c745e963bb4f9ffe2a3889cf3.tar.bz2
gcc-patches-a0691e3578dcab1c745e963bb4f9ffe2a3889cf3.zip
15.0.0: add 72_all_PR117313-linux.patch
Bug: https://gcc.gnu.org/PR117313 Signed-off-by: Sam James <sam@gentoo.org>
-rw-r--r--15.0.0/gentoo/72_all_PR117313-linux.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/15.0.0/gentoo/72_all_PR117313-linux.patch b/15.0.0/gentoo/72_all_PR117313-linux.patch
new file mode 100644
index 0000000..c8cb2e8
--- /dev/null
+++ b/15.0.0/gentoo/72_all_PR117313-linux.patch
@@ -0,0 +1,104 @@
+2024-10-28 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/117313
+gcc/c-family/
+ * c-common.cc (complete_array_type): For RAW_DATA_CST elements
+ advance curindex by RAW_DATA_LENGTH or one less than that if
+ ce->index is non-NULL. Handle even the first element if
+ it is RAW_DATA_CST. Formatting fix.
+gcc/testsuite/
+ * c-c++-common/init-6.c: New test.
+
+--- a/gcc/c-family/c-common.cc 2024-10-27 16:39:55.090871381 +0100
++++ b/gcc/c-family/c-common.cc 2024-10-28 12:30:01.215814079 +0100
+@@ -7044,7 +7044,8 @@ complete_array_type (tree *ptype, tree i
+ {
+ int eltsize
+ = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value)));
+- maxindex = size_int (TREE_STRING_LENGTH (initial_value)/eltsize - 1);
++ maxindex = size_int (TREE_STRING_LENGTH (initial_value) / eltsize
++ - 1);
+ }
+ else if (TREE_CODE (initial_value) == CONSTRUCTOR)
+ {
+@@ -7059,23 +7060,25 @@ complete_array_type (tree *ptype, tree i
+ else
+ {
+ tree curindex;
+- unsigned HOST_WIDE_INT cnt;
++ unsigned HOST_WIDE_INT cnt = 1;
+ constructor_elt *ce;
+ bool fold_p = false;
+
+ if ((*v)[0].index)
+ maxindex = (*v)[0].index, fold_p = true;
++ if (TREE_CODE ((*v)[0].value) == RAW_DATA_CST)
++ cnt = 0;
+
+ curindex = maxindex;
+
+- for (cnt = 1; vec_safe_iterate (v, cnt, &ce); cnt++)
++ for (; vec_safe_iterate (v, cnt, &ce); cnt++)
+ {
+ bool curfold_p = false;
+ if (ce->index)
+ curindex = ce->index, curfold_p = true;
+- else
++ if (!ce->index || TREE_CODE (ce->value) == RAW_DATA_CST)
+ {
+- if (fold_p)
++ if (fold_p || curfold_p)
+ {
+ /* Since we treat size types now as ordinary
+ unsigned types, we need an explicit overflow
+@@ -7083,9 +7086,16 @@ complete_array_type (tree *ptype, tree i
+ tree orig = curindex;
+ curindex = fold_convert (sizetype, curindex);
+ overflow_p |= tree_int_cst_lt (curindex, orig);
++ curfold_p = false;
+ }
+- curindex = size_binop (PLUS_EXPR, curindex,
+- size_one_node);
++ if (TREE_CODE (ce->value) == RAW_DATA_CST)
++ curindex
++ = size_binop (PLUS_EXPR, curindex,
++ size_int (RAW_DATA_LENGTH (ce->value)
++ - (ce->index ? 1 : 0)));
++ else
++ curindex = size_binop (PLUS_EXPR, curindex,
++ size_one_node);
+ }
+ if (tree_int_cst_lt (maxindex, curindex))
+ maxindex = curindex, fold_p = curfold_p;
+--- a/gcc/testsuite/c-c++-common/init-6.c 2024-10-28 12:35:59.526803017 +0100
++++ b/gcc/testsuite/c-c++-common/init-6.c 2024-10-28 12:35:50.394930729 +0100
+@@ -0,0 +1,29 @@
++/* PR c/117313 */
++/* { dg-do compile } */
++/* { dg-options "-O2" } */
++
++struct S { unsigned a; const unsigned char b[]; };
++struct S s = {
++ 1,
++ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5,
++ 0x81, 0xbd, 0x99, 0x81, 0x7e, 0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7,
++ 0xff, 0x7e, 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x10,
++ 0x38, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c,
++ }
++};
++struct S t = {
++ 2,
++ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5,
++ 0x81, 0xbd, 0x99, 0x81, 0x7e, 0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7,
++ 0xff, 0x7e, 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x10,
++ 0x38, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c,
++ 0xff, 0x7e, 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x10,
++ 0x38, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c
++ }
++};