aboutsummaryrefslogtreecommitdiff
path: root/gcc/testlib
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-07-12 23:17:06 +0200
committerEugen Wissner <belka@caraus.de>2026-07-12 23:17:06 +0200
commitb2f8be605d2b79d1d4b1995646e7058bec299a22 (patch)
treeb5dd4a434103d440d7c541badc3cf3097e8ac967 /gcc/testlib
parentfea8ff27f53f960ff7149b360446589a0748aeb5 (diff)
downloadelna-b2f8be605d2b79d1d4b1995646e7058bec299a22.tar.gz
Add fail_compilation tests
Diffstat (limited to 'gcc/testlib')
-rw-r--r--gcc/testlib/elna-dg.exp126
1 files changed, 96 insertions, 30 deletions
diff --git a/gcc/testlib/elna-dg.exp b/gcc/testlib/elna-dg.exp
index 06c81aa..ddebf58 100644
--- a/gcc/testlib/elna-dg.exp
+++ b/gcc/testlib/elna-dg.exp
@@ -4,12 +4,12 @@
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
@@ -20,8 +20,8 @@ load_lib gcc-dg.exp
proc elna-dg-test { prog do_what extra_tool_flags } {
set result \
- [gcc-dg-test-1 elna_target_compile $prog $do_what $extra_tool_flags]
-
+ [gcc-dg-test-1 elna_target_compile $prog $do_what $extra_tool_flags]
+
set comp_output [lindex $result 0]
set output_file [lindex $result 1]
@@ -35,35 +35,101 @@ proc elna-dg-prune { system text } {
# Utility routines.
#
-# Modified dg-runtest that can cycle through a list of optimization options
-# as c-torture does.
+# This procedure copies a test file from the source tree to the
+# build directory while rewriting elna-native directives to dejagnu
+# dg-* equivalents.
+#
+# Directives (inside (* ... *) comments):
#
+# (* @Error message *) Expected compiler error on this line.
+# (* @Flags args *) Extra compiler flags.
+#
+# base - absolute path to the source directory, e.g. .../testsuite/elna.dg
+# test - relative path from testsuite, e.g. fail_compilation/file_name.elna
+#
+proc elna-convert-test { base test } {
+ set type [file dirname $test]
+ set target $test
-proc elna-dg-runtest { testcases flags default-extra-flags } {
- global runtests
- global dg-do-what-default
- global tool
-
- foreach testcase $testcases {
- # If we're only testing specific files and this isn't one of them, skip it.
- if {![runtest_file_p $runtests $testcase]} {
- continue
- }
- # Check the test directory to detect the test type and set the expectation.
- set type [file tail [file dirname $testcase]]
+ # Opens a file in the build directory for writing and the source
+ # file for reading.
+ file mkdir $type
+ set fin [open $base/$target r]
+ set fout [open $target w]
+
+ # Reads the source test file line by line and replace directives with
+ # Elna equivalents using a regular expression.
+ while { [gets $fin line] >= 0 } {
+ regsub -all {\(\*\s*@Error\s+(.*?)\s*\*\)} $line {(* { dg-error "\1" } *)} line
+ regsub -all {\(\*\s*@Flags\s+(.*?)\s*\*\)} $line {(* { dg-additional-options "\1" } *)} line
+ puts $fout $line
+ }
+
+ close $fin
+
+ # Suppress excess output so stray diagnostics do not fail the test.
+ puts $fout "(* { dg-prune-output .* } *)"
+
+ # Emit category-specific expectation.
switch $type {
- compilable {
- set dg-do-what-default "compile"
- }
- runnable {
- set dg-do-what-default "run"
- }
- default {
- ${tool}_fail $testcase "Unknown test type \"$type\""
- return 0
- }
+ compilable {
+ # Assert that an output file was produced.
+ puts $fout "(* { dg-final { output-exists } } *)"
+ }
+ fail_compilation {
+ # Assert that no output file was produced.
+ puts $fout "(* { dg-final { output-exists-not } } *)"
+ }
+ # Other cases are handled automatically.
}
- verbose "Testing $type/[file tail $testcase]"
- dg-test $testcase $flags ${default-extra-flags}
+
+ close $fout
+
+ # Reaches up one stack frame (into elna-dg-runtest) and links the
+ # caller's cleanup_extra_files variable to the local name cleanups.
+ upvar 1 cleanup_extra_files cleanups
+ # This ensures the converted file gets deleted after the test runs.
+ lappend cleanups $target
+
+ return $target
+}
+
+#
+# Main loop for convert each test to dejagnu.
+#
+proc elna-dg-runtest { testcases } {
+ global dg-do-what-default
+ # Saves dejagnu's current "what to do" setting so different test
+ # types don't leak settings between tests.
+ set saved-dg-do-what-default ${dg-do-what-default}
+
+ foreach test $testcases {
+ set type [file tail [file dirname $test]]
+ set name [file tail $test]
+ set base [file dirname [file dirname $test]]
+
+ set cleanup_extra_files ""
+ # Calls the converter, $target receives the relative path of
+ # the converted file.
+ set target "[elna-convert-test $base $type/$name]"
+
+ switch $type {
+ runnable {
+ set dg-do-what-default "run"
+ }
+ compilable -
+ fail_compilation {
+ set dg-do-what-default "compile"
+ }
+ }
+
+ dg-test $target "" ""
+
+ foreach srcfile $cleanup_extra_files {
+ file delete $srcfile
+ }
+ file delete $target
}
+
+ set dg-do-what-default ${saved-dg-do-what-default}
}