commit: a78ebddd40831f2c95a594a15c59ab7c3c485e83 Author: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org> AuthorDate: Fri Jun 5 21:01:11 2020 +0000 Commit: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org> CommitDate: Fri Jun 5 21:01:11 2020 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=a78ebddd
10.1.0: fix ICE on constructor range handling Bug: https://gcc.gnu.org/PR95241 Bug: https://bugs.gentoo.org/726644 Signed-off-by: Sergei Trofimovich <slyfox <AT> gentoo.org> 10.1.0/gentoo/31_all_ctor-range-PR95241.patch | 98 +++++++++++++++++++++++++++ 10.1.0/gentoo/README.history | 1 + 2 files changed, 99 insertions(+) diff --git a/10.1.0/gentoo/31_all_ctor-range-PR95241.patch b/10.1.0/gentoo/31_all_ctor-range-PR95241.patch new file mode 100644 index 0000000..2bd166d --- /dev/null +++ b/10.1.0/gentoo/31_all_ctor-range-PR95241.patch @@ -0,0 +1,98 @@ +https://gcc.gnu.org/PR95241 +https://bugs.gentoo.org/726644 + +From 798a9da416bbfd8996da9a5d53955b082d5b94fe Mon Sep 17 00:00:00 2001 +From: Patrick Palka <ppa...@redhat.com> +Date: Fri, 29 May 2020 09:44:09 -0400 +Subject: [PATCH] c++: constexpr ctor with RANGE_EXPR index [PR95241] + +In the testcase below, the CONSTRUCTOR for 'field' contains a RANGE_EXPR +index: + + {{aggr_init_expr<...>, [1...2]={.off=1}}} + +but get_or_insert_ctor_field isn't prepared to handle looking up a +RANGE_EXPR index. + +This patch adds limited support to get_or_insert_ctor_field for looking +up a RANGE_EXPR index. The limited scope of this patch should make it +more suitable for backporting, and more extensive support would be +needed only to handle self-modifying CONSTRUCTORs that contain a +RANGE_EXPR index, but I haven't yet been able to come up with a testcase +that actually creates such a CONSTRUCTOR. + +gcc/cp/ChangeLog: + + PR c++/95241 + * constexpr.c (get_or_insert_ctor_field): Add limited support + for RANGE_EXPR index lookups. + +gcc/testsuite/ChangeLog: + + PR c++/95241 + * g++.dg/cpp0x/constexpr-array25.C: New test. + +(cherry picked from commit e069285cdf457cc85070e522380c4e25b0d2ed25) +--- + gcc/cp/constexpr.c | 16 ++++++++++++++ + .../g++.dg/cpp0x/constexpr-array25.C | 21 +++++++++++++++++++ + 2 files changed, 37 insertions(+) + create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-array25.C + +diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c +index 706d8a13d8e..3bd2524648d 100644 +--- a/gcc/cp/constexpr.c ++++ b/gcc/cp/constexpr.c +@@ -3245,6 +3245,22 @@ get_or_insert_ctor_field (tree ctor, tree index, int pos_hint = -1) + } + else if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE) + { ++ if (TREE_CODE (index) == RANGE_EXPR) ++ { ++ /* Support for RANGE_EXPR index lookups is currently limited to ++ accessing an existing element via POS_HINT, or appending a new ++ element to the end of CTOR. ??? Support for other access ++ patterns may also be needed. */ ++ vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ctor); ++ if (vec_safe_length (elts)) ++ { ++ tree lo = TREE_OPERAND (index, 0); ++ gcc_assert (array_index_cmp (elts->last().index, lo) < 0); ++ } ++ CONSTRUCTOR_APPEND_ELT (elts, index, NULL_TREE); ++ return &elts->last(); ++ } ++ + HOST_WIDE_INT i = find_array_ctor_elt (ctor, index, /*insert*/true); + gcc_assert (i >= 0); + constructor_elt *cep = CONSTRUCTOR_ELT (ctor, i); +diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array25.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array25.C +new file mode 100644 +index 00000000000..9162943249f +--- /dev/null ++++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array25.C +@@ -0,0 +1,21 @@ ++// PR c++/95241 ++// { dg-do compile { target c++11 } } ++ ++struct Fragment ++{ ++ int off; ++ constexpr Fragment(int _off) : off(_off) { } ++ constexpr Fragment() : Fragment(1) { } ++}; ++ ++struct Field ++{ ++ Fragment fragments[3]; ++ constexpr Field(int off) : fragments{{off}} { } ++}; ++ ++constexpr Field field{0}; ++ ++static_assert(field.fragments[0].off == 0 ++ && field.fragments[1].off == 1 ++ && field.fragments[2].off == 1, ""); +-- +2.27.0 + diff --git a/10.1.0/gentoo/README.history b/10.1.0/gentoo/README.history index d7a8c51..deee08f 100644 --- a/10.1.0/gentoo/README.history +++ b/10.1.0/gentoo/README.history @@ -1,6 +1,7 @@ 2 TODO + 29_all_fix-float-hang-PR95118.patch + 30_all_lto-intl-workaround-PR95194.patch + + 31_all_ctor-range-PR95241.patch 1 05 May 2020 + 01_all_default-fortify-source.patch