gfortran testsuite: Remove unit-files in files having open-statements, PR116701

PR testsuite/116701 shows that left-behind files from
unnamed gfortran open statements (named unit.N, where N =
unit number) can interfere with the result of a subsequent
run.  While that's unlikely to happen for a "real" fortran
target or a test with a deleting close-statement, test-cases
should not rely on previous test-cases passing and not
execute along different execution paths depending on earlier
runs, even if the difference is benevolent.

Most but not all fortran test-cases go through
gfortran-dg-runtest (gfortran.dg) or fortran-torture-execute
(gfortran.fortran-torture).  However, the exceptions, with
more complex framework and call-chains, either don't run or
don't have open-statements, so a more complex solution
doesn't seem worthwhile.  If test-cases with open-statements
are added later to those parts of the test-suite, calls to
fortran-delete-unit-files at the right spot may be added or
worst case, "manual" cleanup-calls added, like:
! { dg-final { remote_file target delete "fort.10" } }
Put the new proc in fortran-modules.exp since that's where other
common fortran-testsuite dejagnu-library functions are located.

	PR testsuite/116701
	* lib/fortran-modules.exp (fortran-delete-unit-files): New proc.
	* lib/gfortran-dg.exp (gfortran-dg-runtest): Call
	fortran-delete-unit-files after executing test.
	* lib/fortran-torture.exp (fortran-torture-execute): Ditto.
This commit is contained in:
Hans-Peter Nilsson 2024-09-23 18:44:11 +02:00 committed by Hans-Peter Nilsson
parent 6fee826bc1
commit 14cd10815a
3 changed files with 24 additions and 0 deletions

View file

@ -172,3 +172,24 @@ proc igrep { args } {
}
return $grep_out
}
# If the code has any "open" statements for numbered units, make sure
# no corresponding output file remains. Redundant remove operations
# are ok, but duplicate removals look sloppy, so track for uniqueness.
proc fortran-delete-unit-files { src } {
set openpat {open *\( *(?:unit *= *)?([0-9]+)}
set openmatches [igrep $src $openpat]
if {![string match "" $openmatches]} {
# verbose -log "Found \"$openmatches\""
set deleted_units {}
foreach openmatch $openmatches {
regexp -nocase -- "$openpat" $openmatch match unit
if {[lsearch $deleted_units $unit] < 0} {
set rmfile "fort.$unit"
verbose -log "Deleting $rmfile"
remote_file target delete "fort.$unit"
lappend deleted_units $unit
}
}
}
}

View file

@ -332,6 +332,8 @@ proc fortran-torture-execute { src } {
catch { remote_file build delete $executable }
}
$status "$testcase execution, $option"
fortran-delete-unit-files $src
}
cleanup-modules ""
}

View file

@ -160,6 +160,7 @@ proc gfortran-dg-runtest { testcases flags default-extra-flags } {
foreach flags_t $option_list {
verbose "Testing $nshort, $flags $flags_t" 1
dg-test $test "$flags $flags_t" ${default-extra-flags}
fortran-delete-unit-files $test
cleanup-modules ""
}
}