Hi! On 2020-08-10T17:30:21-0400, Marek Polacek via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > This patch adds a new DejaGNU directive, dg-ice, as outlined in the > proposal here: > https://gcc.gnu.org/pipermail/gcc-patches/2020-July/550913.html > > It means that it's expected that the compiler crashes with an internal > compiler error when compiling test with such a directive.
Thanks, I find this useful. So I have a testcase that currently ICEs... ;-) spawn -ignore SIGHUP [xgcc] during GIMPLE pass: omplower In file included from [...]:4: [...]: In function 'f_data': [...]:41:10: internal compiler error: in lower_omp_target, at omp-low.c:11890 [backtrace] Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. compiler exited with status 1 I put '{ dg-ice }' into it, and do get the expected: XFAIL: [...] (internal compiler error)' But I also get an unexpected: FAIL: [...] (test for excess errors)' That's because of: Excess errors: during GIMPLE pass: omplower I can easily '{ dg-prune-output "during GIMPLE pass: omplower" }', of course, or should this lead-in be pruned internally, automatically? And then, this is a '{ dg-do run }' testcase, I see: UNRESOLVED: libgomp.oacc-c/../libgomp.oacc-c-c++-common/declare-vla-kernels-decompose.c -DACC_DEVICE_TYPE_nvidia=1 -DACC_MEM_SHARED=0 -foffload=nvptx-none -O0 compilation failed to produce executable Given '{ dg-ice }', it's obvious that we don't get an executable to run. I thought that maybe '{ dg-ice }' testcases should automatically be demoted into '{ dg-do compile }', but that would be wrong for link-time ICEs. But can we "expect" the UNRESOLVED, and turn that into another XFAIL? Aha, actually I see that for '{ dg-do link }', this seems to behave as expected (no UNRESOLVED), so we might demote all '{ dg-ice }' testcases from '{ dg-do run }' to '{ dg-do link }', if that makes sense? Grüße Thomas > diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi > index 63216a0daba..967cb135cb4 100644 > --- a/gcc/doc/sourcebuild.texi > +++ b/gcc/doc/sourcebuild.texi > @@ -1172,6 +1172,16 @@ Expect the execute step of a test to fail if the > conditions (which are > the same as for @code{dg-skip-if}) are met. > @end table > > +@subsubsection Expect the compiler to crash > + > +@table @code > +@item @{ dg-ice @var{comment} [@{ @var{selector} @} [@{ @var{include-opts} > @} [@{ @var{exclude-opts} @}]]] @} > +Expect the compiler to crash with an internal compiler error and return > +a nonzero exit status if the conditions (which are the same as for > +@code{dg-skip-if}) are met. Used for tests that test bugs that have not been > +fixed yet. > +@end table > + > @subsubsection Expect the test executable to fail > > @table @code > diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp > index 45d97024883..e8ad3052657 100644 > --- a/gcc/testsuite/lib/gcc-dg.exp > +++ b/gcc/testsuite/lib/gcc-dg.exp > @@ -308,13 +308,27 @@ proc gcc-dg-test-1 { target_compile prog do_what > extra_tool_flags } { > verbose "$target_compile $prog $output_file $compile_type $options" 4 > set comp_output [$target_compile "$prog" "$output_file" "$compile_type" > $options] > > + global expect_ice > # Look for an internal compiler error, which sometimes masks the fact > # that we didn't get an expected error message. XFAIL an ICE via > # dg-xfail-if and use { dg-prune-output ".*internal compiler error.*" } > # to avoid a second failure for excess errors. > - if [string match "*internal compiler error*" $comp_output] { > + # "Error reporting routines re-entered" ICE says "Internal" rather than > + # "internal", so match that too. > + if [string match {*[Ii]nternal compiler error*} $comp_output] { > upvar 2 name name > - fail "$name (internal compiler error)" > + if { $expect_ice == 0 } { > + fail "$name (internal compiler error)" > + } else { > + # We expected an ICE and we got it. > + xfail "$name (internal compiler error)" > + # Prune the ICE from the output. > + set comp_output [prune_ices $comp_output] > + } > + } elseif { $expect_ice == 1 } { > + upvar 2 name name > + # We expected an ICE but we didn't get it. > + xpass "$name (internal compiler error)" > } > > if { $do_what == "repo" } { > @@ -939,6 +953,7 @@ if { [info procs saved-dg-test] == [list] } { > global additional_prunes > global compiler_conditional_xfail_data > global shouldfail > + global expect_ice > global testname_with_flags > global set_target_env_var > global set_compiler_env_var > @@ -954,6 +969,7 @@ if { [info procs saved-dg-test] == [list] } { > set additional_sources_used "" > set additional_prunes "" > set shouldfail 0 > + set expect_ice 0 > if [info exists set_target_env_var] { > unset set_target_env_var > } > diff --git a/gcc/testsuite/lib/prune.exp b/gcc/testsuite/lib/prune.exp > index 1c776249f1a..58a739684a5 100644 > --- a/gcc/testsuite/lib/prune.exp > +++ b/gcc/testsuite/lib/prune.exp > @@ -118,6 +118,15 @@ proc prune_file_path { text } { > return $text > } > > +# Prune internal compiler error messages, including the "Please submit..." > +# footnote. > + > +proc prune_ices { text } { > + regsub -all "(^|\n)\[^\n\]*: internal compiler error:.*for > instructions\[^\n\]*" $text "" text > + regsub -all "(^|\n|')*Internal compiler error:.*for instructions\[^\n\]*" > $text "" text > + return $text > +} > + > # Provide a definition of this if missing (delete after next dejagnu > release). > > if { [info procs prune_warnings] == "" } then { > diff --git a/gcc/testsuite/lib/target-supports-dg.exp > b/gcc/testsuite/lib/target-supports-dg.exp > index 2a21424b890..5bb99f4e8f9 100644 > --- a/gcc/testsuite/lib/target-supports-dg.exp > +++ b/gcc/testsuite/lib/target-supports-dg.exp > @@ -495,6 +495,34 @@ proc dg-shouldfail { args } { > } > } > > +# Record whether the compiler is expected (at the moment) to ICE. > +# Used for tests that test bugs that have not been fixed yet. > + > +set expect_ice 0 > + > +proc dg-ice { args } { > + # Don't bother if we're already skipping the test. > + upvar dg-do-what dg-do-what > + if { [lindex ${dg-do-what} 1] == "N" } { > + return > + } > + > + global expect_ice > + > + set args [lreplace $args 0 0] > + if { [llength $args] > 1 } { > + set selector [list target [lindex $args 1]] > + if { [dg-process-target-1 $selector] == "S" } { > + # The target matches, now check the flags. > + if [check-flags $args] { > + set expect_ice 1 > + } > + } > + } else { > + set expect_ice 1 > + } > +} > + > # Intercept the call to the DejaGnu version of dg-process-target to > # support use of an effective-target keyword in place of a list of > # target triplets to xfail or skip a test. > > base-commit: e4ced0b60ccb4c944970304cf74f1ee9086e5553 > -- > 2.26.2 ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter