diff options
author | Sam James <sam@gentoo.org> | 2024-10-28 21:32:18 +0000 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2024-10-28 21:32:18 +0000 |
commit | a0691e3578dcab1c745e963bb4f9ffe2a3889cf3 (patch) | |
tree | 128f26c45d39715d0578184ca1de9ad4d37cb7f6 | |
parent | 15.0.0: cut patchset 20 (diff) | |
download | gcc-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.patch | 104 |
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 ++ } ++}; |