aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2020-07-23 22:20:37 -0400
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 15:07:56 -0300
commit88fbd28b20bb6407e9a87cc17286ff840956c65e (patch)
treeaefbf5e1e0fe1b0a6619cd7d578d19f9d0d32b99 /gcc/testsuite
parent5634d8a9b56de06f9d4aab55543991a9f8b3db36 (diff)
testsuite: Introduce dg-ice.
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. A minor optimization could be to use -pass-exit-codes and then check for ICE_EXIT_CODE return code instead of using string match. gcc/ChangeLog: * doc/sourcebuild.texi: Document dg-ice. gcc/testsuite/ChangeLog: * lib/gcc-dg.exp (gcc-dg-test-1): Handle dg-ice. (cleanup-after-saved-dg-test): Reset expect_ice. * lib/prune.exp (prune_ices): New. * lib/target-supports-dg.exp (dg-ice): New.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/lib/gcc-dg.exp20
-rw-r--r--gcc/testsuite/lib/prune.exp9
-rw-r--r--gcc/testsuite/lib/target-supports-dg.exp28
3 files changed, 55 insertions, 2 deletions
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.