From effcb4181e143bc390286a489ff849768a49f6af Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Wed, 15 Apr 2020 12:47:41 -0400 Subject: c++: Error recovery with erroneous DECL_INITIAL [PR94475] Here we're ICE'ing in do_narrow during error-recovery, because ocp_convert returns error_mark_node after it attempts to reduce a const decl to its erroneous DECL_INITIAL via scalar_constant_value, and we later pass this error_mark_node to fold_build2 which isn't prepared to handle error_mark_nodes. We could fix this ICE in do_narrow by checking if ocp_convert returns error_mark_node, but for the sake of consistency and for better error recovery it seems it'd be preferable if ocp_convert didn't care that a const decl's initializer is erroneous and would instead proceed as if the decl was not const, which is the approach that this patch takes. gcc/cp/ChangeLog: PR c++/94475 * cvt.c (ocp_convert): If the result of scalar_constant_value is erroneous, ignore it and use the original expression. gcc/testsuite/ChangeLog: PR c++/94475 * g++.dg/conversion/err-recover2.C: New test. * g++.dg/diagnostic/pr84138.C: Remove now-bogus warning. * g++.dg/warn/Wsign-compare-8.C: Remove now-bogus warning. --- gcc/cp/cvt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'gcc/cp/cvt.c') diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index a3b8096..656e7fd 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -723,7 +723,9 @@ ocp_convert (tree type, tree expr, int convtype, int flags, if (!CLASS_TYPE_P (type)) { e = mark_rvalue_use (e); - e = scalar_constant_value (e); + tree v = scalar_constant_value (e); + if (!error_operand_p (v)) + e = v; } if (error_operand_p (e)) return error_mark_node; -- cgit v1.1