Hi Jerry,
I've made a small compiler survey how they behave on namelist read
from an internal unit when:
1.) there is a single input line of the type
"&stuff" // testchar // " n = 666/"
2.) the input spans 2 lines split after the testchar
3.) same as 2.) but first line right-adjusted
See attached source code.
Competitors: Intel, NAG, NVidia, gfortran at r14-547 with -std=f2018.
My findings were (last column is iostat, next-to-last is n read or -1):
NAG:
Compiler version = NAG Fortran Compiler Release 7.1(Hanzomon) Build 7101
1-line: > < 666 0
2-line/left: > < 666 0
2-line/right: > < 666 0
1-line: >!< -1 187
2-line/left: >!< -1 187
2-line/right: >!< -1 187
1-line: >/< -1 187
2-line/left: >/< -1 187
2-line/right: >/< -1 187
1-line: >,< -1 187
2-line/left: >,< -1 187
2-line/right: >,< -1 187
1-line: >;< -1 187
2-line/left: >;< -1 187
2-line/right: >;< -1 187
1-line: tab 666 0
2-line/left: tab 666 0
2-line/right: tab 666 0
1-line: lf -1 187
2-line/left: lf -1 187
2-line/right: lf -1 187
1-line: ret -1 187
2-line/left: ret -1 187
2-line/right: ret -1 187
My interpretation of this is that NAG treats tab as (white)space,
everything else gives an error. This is the strictest compiler.
Intel:
Compiler version = Intel(R) Fortran Intel(R) 64 Compiler Classic for
applications running on Intel(R) 64, Version 2021.9.0 Build 20230302_000000
1-line: > < 666 0
2-line/left: > < 666 0
2-line/right: > < 666 0
1-line: >!< -1 -1
2-line/left: >!< 666 0
2-line/right: >!< 666 0
1-line: >/< -1 0
2-line/left: >/< -1 0
2-line/right: >/< -1 0
1-line: >,< -1 17
2-line/left: >,< -1 17
2-line/right: >,< -1 17
1-line: >;< -1 17
2-line/left: >;< -1 17
2-line/right: >;< -1 17
1-line: tab 666 0
2-line/left: tab 666 0
2-line/right: tab 666 0
1-line: lf 666 0
2-line/left: lf 666 0
2-line/right: lf 666 0
1-line: ret -1 17
2-line/left: ret -1 17
2-line/right: ret -1 17
Nvidia:
Compiler version = nvfortran 23.3-0
1-line: > < 666 0
2-line/left: > < 666 0
2-line/right: > < 666 0
1-line: >!< -1 -1
2-line/left: >!< -1 -1
2-line/right: >!< -1 -1
1-line: >/< -1 -1
2-line/left: >/< -1 -1
2-line/right: >/< -1 -1
1-line: >,< -1 -1
2-line/left: >,< -1 -1
2-line/right: >,< -1 -1
1-line: >;< -1 -1
2-line/left: >;< -1 -1
2-line/right: >;< -1 -1
1-line: tab 666 0
2-line/left: tab 666 0
2-line/right: tab 666 0
1-line: lf -1 -1
2-line/left: lf 666 0
2-line/right: lf 666 0
1-line: ret 666 0
2-line/left: ret 666 0
2-line/right: ret 666 0
gfortran (see above):
Compiler version = GCC version 14.0.0 20230506 (experimental)
1-line: > < 666 0
2-line/left: > < 666 0
2-line/right: > < 666 0
1-line: >!< -1 -1
2-line/left: >!< -1 0
2-line/right: >!< 666 0
1-line: >/< -1 0
2-line/left: >/< -1 0
2-line/right: >/< -1 0
1-line: >,< 666 5010
2-line/left: >,< 666 5010
2-line/right: >,< 666 5010
1-line: >;< 666 0
2-line/left: >;< 666 0
2-line/right: >;< 666 0
1-line: tab 666 0
2-line/left: tab 666 0
2-line/right: tab 666 0
1-line: lf 666 0
2-line/left: lf 666 0
2-line/right: lf 666 0
1-line: ret 666 0
2-line/left: ret 666 0
2-line/right: ret 666 0
So there seems to be a consensus that "," and ";" must be rejected,
and tab is accepted (makes real sense), but already the termination
character "/" and comment character "!" are treated differently.
And how do we want to treat lf and ret in internal files with
-std=f20xx?
Cheers,
Harald
On 5/7/23 19:33, Jerry D via Gcc-patches wrote:
On 5/6/23 11:15 AM, Harald Anlauf via Fortran wrote:
Hi Jerry, Steve,
I think I have to pour a little water into the wine.
The patch fixes the reported issue only for a comma after
the namelist name, but we still accept a few other illegal
characters, e.g. ';', because:
#define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \
|| c == '\t' || c == '\r' || c == ';' || \
(dtp->u.p.namelist_mode && c == '!'))
We don't want that in standard conformance mode, or do we?
Cheers,
Harald
On 5/6/23 06:02, Steve Kargl via Gcc-patches wrote:
On Fri, May 05, 2023 at 08:41:48PM -0700, Jerry D via Fortran wrote:
The attached patch adds a check for the invalid comma and emits a
runtime
error if -std=f95,f2003,f2018 are specified at compile time.
Attached patch includes a new test case.
Regression tested on x86_64-linux-gnu.
OK for mainline?
Yes. Thanks for the fix. It's been a long time since
I looked at libgfortran code and couldn't quite determine
where to start to fix this.
As I think back, I don't recall ever seeing a semi-colon used after a
NAMELIST name, so I think we should reject it always. The other "soft"
blanks we should allow.
I will make a another patch on trunk to reject the semi-colon and if no
one objects here I will test and push it.
Regards,
Jerry
program testnmlread
use iso_fortran_env, only: compiler_version
implicit none
print *,'Compiler version = ',trim(compiler_version())
call test (" ")
call test ("!")
call test ("/")
call test (",")
call test (";")
call test (achar(9), "tab")
call test (achar(10), "lf")
call test (achar(13), "ret")
contains
subroutine test (c, desc)
character, intent(in) :: c
character(*), intent(in), optional :: desc
character(8) :: d
character(16) :: line, lines(2)
integer :: ios
integer :: n
namelist/stuff/n
character(*), parameter :: s1 = "&stuff", s2 = " n = 666/"
d = ">" // c // "<"; if (present (desc)) d = desc
! Prepare input:
line = s1 // c // s2
lines(1) = s1 // c ! Left-adjusted
lines(2) = s2
! Single line input
n = -1
read(line,nml=stuff,iostat=ios)
write(*,*) "1-line: ", trim (d), n, ios
! Multi-line input
n = -1
read(lines,nml=stuff, iostat=ios)
write(*,*) "2-line/left: ", trim (d), n, ios
lines(1) = adjustr (lines(1)) ! Right-adjust first line
n = -1
read(lines,nml=stuff, iostat=ios)
write(*,*) "2-line/right: ", trim (d), n, ios
end subroutine test
end program testnmlread