diff options
author | Sergei Trofimovich <slyfox@gentoo.org> | 2020-06-24 21:14:42 +0100 |
---|---|---|
committer | Sergei Trofimovich <slyfox@gentoo.org> | 2020-06-24 21:14:42 +0100 |
commit | 21ed34524e3ab3139c811b6d61f50522ebd2b184 (patch) | |
tree | db0ce232adcee7c388dd9b6565f87278ff356f38 /10.1.0 | |
parent | 10.1.0: backport CET cross-compiler detection, PR95811 (diff) | |
download | gcc-patches-21ed34524e3ab3139c811b6d61f50522ebd2b184.tar.gz gcc-patches-21ed34524e3ab3139c811b6d61f50522ebd2b184.tar.bz2 gcc-patches-21ed34524e3ab3139c811b6d61f50522ebd2b184.zip |
10.1.0: backport PR95508, ICE on array subscript implicit conversion
Reported-by: hsk17@mail.de
Bug: https://bugs.gentoo.org/729434
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Diffstat (limited to '10.1.0')
-rw-r--r-- | 10.1.0/gentoo/35_all_ICE-array-subscript-PR95508.patch | 106 | ||||
-rw-r--r-- | 10.1.0/gentoo/README.history | 1 |
2 files changed, 107 insertions, 0 deletions
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 <polacek@redhat.com> +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 |