You made me look!
F2003 was the first to have any wording on this - I can't find relevant
wording in prior standards:
"An input/output statement that is executed while another input/output
statement is being executed is called a recursive input/output statement.
A recursive input/output statement shall not identify an external unit
except that a child data transfer statement may identify its parent data
transfer statement external unit." 9.11 p2-3
A simplistic reading of this is that co-executing I/O statements, where
one identifies an external unit and one an internal unit, are allowed. A
more careful reading suggests order is important, and that if the
internal unit statement is started first, you're not allowed to start a
recursive operation on an external unit (which is what the test program
does.) I don't think this is what was intended.
F2008 revised this text, eliminating the ordering implication:
"An input/output statement that is executed while another input/output
statement is being executed is a recursive input/output statement. A
recursive input/output statement shall not identify an external unit
that is identified by another input/output statement being executed
except that a child data transfer statement may identify its parent data
transfer statement external unit." 9.12p2
So as of F2008, recursive data transfer statements were allowed as long
as they didn't both identify the same external unit.
F2018 did not change the wording here.