commit: 21ed34524e3ab3139c811b6d61f50522ebd2b184 Author: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org> AuthorDate: Wed Jun 24 20:14:42 2020 +0000 Commit: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org> CommitDate: Wed Jun 24 20:14:42 2020 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=21ed3452
10.1.0: backport PR95508, ICE on array subscript implicit conversion Reported-by: hsk17 <AT> mail.de Bug: https://bugs.gentoo.org/729434 Signed-off-by: Sergei Trofimovich <slyfox <AT> gentoo.org> .../35_all_ICE-array-subscript-PR95508.patch | 106 +++++++++++++++++++++ 10.1.0/gentoo/README.history | 1 + 2 files changed, 107 insertions(+) diff --git a/10.1.0/gentoo/35_all_ICE-array-subscript-PR95508.patch b/10.1.0/gentoo/35_all_ICE-array-subscript-PR95508.patch new file mode 100644 index 0000000..37abd53 --- /dev/null +++ b/10.1.0/gentoo/35_all_ICE-array-subscript-PR95508.patch @@ -0,0 +1,106 @@ +https://gcc.gnu.org/PR95508 +https://bugs.gentoo.org/729434 + +From 1bab254fd30c2b94a675b9057349fc80946375b1 Mon Sep 17 00:00:00 2001 +From: Marek Polacek <[email protected]> +Date: Wed, 17 Jun 2020 14:38:05 -0400 +Subject: [PATCH] c++: ICE with IMPLICIT_CONV_EXPR in array subscript [PR95508] + +Since r10-7096 convert_like, when called in a template, creates an +IMPLICIT_CONV_EXPR when we're converting to/from array type. + +In this test, we have e[f], and we're converting f (of type class A) to +int, so convert_like in build_new_op_1 created the IMPLICIT_CONV_EXPR +that got into cp_build_array_ref which calls maybe_constant_value. My +patch above failed to adjust this spot to call fold_non_dependent_expr +instead, which can handle codes like I_C_E in a template. Fixed by +using a new function maybe_fold_non_dependent_expr, which, if the expr +can't be evaluated to a constant, returns the original expression. + +gcc/cp/ChangeLog: + + PR c++/95508 + * constexpr.c (maybe_fold_non_dependent_expr): New. + * cp-tree.h (maybe_fold_non_dependent_expr): Declare. + * typeck.c (cp_build_array_ref): Call maybe_fold_non_dependent_expr + instead of maybe_constant_value. + +gcc/testsuite/ChangeLog: + + PR c++/95508 + * g++.dg/template/conv16.C: New test. +--- + gcc/cp/constexpr.c | 13 +++++++++++++ + gcc/cp/cp-tree.h | 2 ++ + gcc/cp/typeck.c | 2 +- + gcc/testsuite/g++.dg/template/conv16.C | 17 +++++++++++++++++ + 4 files changed, 33 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/g++.dg/template/conv16.C + +--- a/gcc/cp/constexpr.c ++++ b/gcc/cp/constexpr.c +@@ -7043,6 +7043,19 @@ fold_non_dependent_expr (tree t, + return maybe_constant_value (t, object, manifestly_const_eval); + } + ++/* Like fold_non_dependent_expr, but if EXPR couldn't be folded to a constant, ++ return the original expression. */ ++ ++tree ++maybe_fold_non_dependent_expr (tree expr, ++ tsubst_flags_t complain/*=tf_warning_or_error*/) ++{ ++ tree t = fold_non_dependent_expr (expr, complain); ++ if (t && TREE_CONSTANT (t)) ++ return t; ++ ++ return expr; ++} + + /* Like maybe_constant_init but first fully instantiate the argument. */ + +--- a/gcc/cp/cp-tree.h ++++ b/gcc/cp/cp-tree.h +@@ -7955,6 +7955,8 @@ extern tree maybe_constant_init (tree, tree = NULL_TREE, bool = false); + extern tree fold_non_dependent_expr (tree, + tsubst_flags_t = tf_warning_or_error, + bool = false, tree = NULL_TREE); ++extern tree maybe_fold_non_dependent_expr (tree, ++ tsubst_flags_t = tf_warning_or_error); + extern tree fold_non_dependent_init (tree, + tsubst_flags_t = tf_warning_or_error, + bool = false); +--- a/gcc/cp/typeck.c ++++ b/gcc/cp/typeck.c +@@ -3553,7 +3553,7 @@ cp_build_array_ref (location_t loc, tree array, tree idx, + pointer arithmetic.) */ + idx = cp_perform_integral_promotions (idx, complain); + +- idx = maybe_constant_value (idx); ++ idx = maybe_fold_non_dependent_expr (idx, complain); + + /* An array that is indexed by a non-constant + cannot be stored in a register; we must be able to do +--- /dev/null ++++ b/gcc/testsuite/g++.dg/template/conv16.C +@@ -0,0 +1,17 @@ ++// PR c++/95508 ++// { dg-do compile } ++ ++template <typename> ++struct A; ++template <typename> ++struct B { ++ operator int () { return 0; } ++}; ++template <> ++struct A<unsigned> : B<int> {}; ++struct D { ++ template <typename> ++ int foo () { return e[f]; } ++ int e[6]; ++ A<unsigned> f; ++}; +-- +2.27.0 + diff --git a/10.1.0/gentoo/README.history b/10.1.0/gentoo/README.history index 480a54e..72e0086 100644 --- a/10.1.0/gentoo/README.history +++ b/10.1.0/gentoo/README.history @@ -1,6 +1,7 @@ 3 TODO 33_all_avx512-scalar-PR95528.patch 34_all_cet-cross-x86.patch + 35_all_ICE-array-subscript-PR95508.patch 2 11 June 2020 + 29_all_fix-float-hang-PR95118.patch
