Commit effcb418 by Patrick Palka

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.
parent 44b32683
2020-04-16 Patrick Palka <ppalka@redhat.com>
PR c++/94475
* cvt.c (ocp_convert): If the result of scalar_constant_value is
erroneous, ignore it and use the original expression.
2020-04-16 Jakub Jelinek <jakub@redhat.com>
PR c++/94571
......
......@@ -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;
......
2020-04-16 Patrick Palka <ppalka@redhat.com>
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.
2020-04-16 Richard Sandiford <richard.sandiford@arm.com>
PR rtl-optimization/94605
......
// PR c++/94475
// { dg-do compile }
unsigned char
sr ()
{
const unsigned char xz = EI; // { dg-error "not declared" }
return xz - (xz >> 1);
}
......@@ -5,4 +5,4 @@ foo()
{
const int i = 0 = 0; // { dg-error "lvalue required as left operand" }
return 1 ? 0 : (char)i;
} // { dg-warning "control reaches" }
}
......@@ -5,4 +5,4 @@ bool foo (char c)
{
const int i = 0 = 0; // { dg-error "lvalue" }
return c = i;
} // { dg-warning "control reaches" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment