c++: Error recovery with erroneous DECL_INITIAL [PR94475]
authorPatrick Palka <ppalka@redhat.com>
Wed, 15 Apr 2020 16:47:41 +0000 (12:47 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 16 Apr 2020 12:58:40 +0000 (08:58 -0400)
commiteffcb4181e143bc390286a489ff849768a49f6af
tree1f8b06662fc21d4c9b0103fa8520b773d2404f1f
parent44b326839d864fc10c459916abcc97f35a9ac3de
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/ChangeLog
gcc/cp/cvt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/conversion/err-recover2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/pr84138.C
gcc/testsuite/g++.dg/warn/Wsign-compare-8.C