Practical Fortran
Assertions
Stop on Failure
An inline if paired with error stop aborts the program when a result is wrong, otherwise execution falls through.
Program
Play the program to verify a double_value function and confirm all checks pass.
assertion.f90
Replay: real traced execution (multi-file project)
program assertion_demo
implicit none
integer :: result_
result_ = double_value(2)
if (result_ /= 4) error stop "double(2) failed"
result_ = double_value(0)
if (result_ /= 0) error stop "double(0) failed"
print '(A)', "all checks passed"
contains
function double_value(n) result(out)
integer, intent(in) :: n
integer :: out
out = n * 2
end function double_value
end program assertion_demo
result_ ← 4
5result_ = double_value(2)6if (result_ /= 4) error stop "double(2) failed"values this step4result_result_ /= 4 ← .false.
5result_ = double_value(2)6if (result_ /= 4) error stop "double(2) failed"values this step.false.result_ /= 44result_result_ ← 0
8result_ = double_value(0)9if (result_ /= 0) error stop "double(0) failed"values this step0result_result_ /= 0 ← .false.
8result_ = double_value(0)9if (result_ /= 0) error stop "double(0) failed"values this step.false.result_ /= 00result_print '(A)', "all checks passed"
11 print '(A)', "all checks passed"12containsoutputall checks passed
Follow the Checks
double_value(2)returns4.- The check
result_ /= 4is.false., so the program keeps going. double_value(0)returns0.- The check
result_ /= 0is also.false.. - No check stops the program, so it prints
all checks passed. | call | result_ | failure check | continues? | | --- | --- | --- | --- | |double_value(2)| 4 |.false.| yes | |double_value(0)| 0 |.false.| yes | | final print | all checks passed | - | yes |
inline if
`if (cond) stmt` is the single-statement if form.
error stop
`error stop "msg"` aborts the program with a non-zero status.
function check
A small function plus checks demonstrates the test pattern without a test harness.
Exercise: assertion.f90
Reproduce all checks passed, then trace why both failure checks are .false. for results 4 and 0.