public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result.
@ 2021-08-12 3:28 david.sagan at gmail dot com
2021-08-12 16:05 ` [Bug fortran/101871] " kargl at gcc dot gnu.org
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: david.sagan at gmail dot com @ 2021-08-12 3:28 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871
Bug ID: 101871
Summary: Array of strings of different length passed as an
argument produces invalid result.
Product: gcc
Version: og10 (devel/omp/gcc-10)
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: david.sagan at gmail dot com
Target Milestone: ---
Consider the test program:
program tao_program
implicit none
integer i
character(80) abc(9)
character(40) name
name = 'abasdfadsf'
abc = [character(80):: &
'Beam parameters not computed at: ' // trim(name), &
'Singular sigma matrix is:', &
' \6es15.7\', ' \6es15.7\', ' \6es15.7\', ' \6es15.7\', '
\6es15.7\', ' \6es15.7\', &
'Will not print any more singular sigma matrices']
do i = 1, size(abc)
print '(i6, 2x, a)', i, trim(abc(i))
enddo
call out_io_lines2 ([character(80):: &
'Beam parameters not computed at: ' // trim(name), &
'Singular sigma matrix is:', &
' \6es15.7\', ' \6es15.7\', ' \6es15.7\', ' \6es15.7\', '
\6es15.7\', ' \6es15.7\', &
'Will not print any more singular sigma matrices'])
contains
subroutine out_io_lines2 (lines)
implicit none
character(*) lines(:)
integer i
do i = 1, size(lines)
print '(i6, 2x, a)', i, trim(lines(i))
enddo
end subroutine out_io_lines2
end program
Now compile and run:
> gfortran tao_program.f90
mac-mini-2:~/Bmad/test> ./a.out
1 Beam parameters not computed at: abasdfadsf
2 Singular sigma matrix is:
3 \6es15.7\
4 \6es15.7\
5 \6es15.7\
6 \6es15.7\
7 \6es15.7\
8 \6es15.7\
9 Will not print any more singular sigma matrices
1 Beam parameters not computed at: abasdfadsf
2 Singular sigma matrix is:
3 \6es15.7\
4 \6es15.7\
5 \6es15.7\
6 \6es15.7\
7 \6es15.7\
8 \6es15.7\
9 Will not print any more singular sigma matr
Notice that the second "9" line is truncated. This should not be.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/101871] Array of strings of different length passed as an argument produces invalid result. 2021-08-12 3:28 [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result david.sagan at gmail dot com @ 2021-08-12 16:05 ` kargl at gcc dot gnu.org 2021-08-12 18:43 ` anlauf at gcc dot gnu.org ` (4 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: kargl at gcc dot gnu.org @ 2021-08-12 16:05 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871 kargl at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 CC| |kargl at gcc dot gnu.org Status|UNCONFIRMED |NEW Last reconfirmed| |2021-08-12 --- Comment #1 from kargl at gcc dot gnu.org --- (In reply to David Sagan from comment #0) > > call out_io_lines2 ([character(80):: & > 'Beam parameters not computed at: ' // trim(name), & > 'Singular sigma matrix is:', & > ' \6es15.7\', ' \6es15.7\', ' \6es15.7\', ' \6es15.7\', ' > \6es15.7\', ' \6es15.7\', & > 'Will not print any more singular sigma matrices']) For some reason, gfortran is ignoring the type-spec in the array constructor of the actual argument if one uses the concatenation operator in the first element of the constructor. The length is set to that of the first element. This is going to be entertaining for whomever takes on the challenge. Here's a modified test to consider program tao_program implicit none integer i character(80) abc(9) character(40) name name = 'H' abc = [character(80) :: 'a'//trim(name), 'ab', 'abc', 'd', 'def', 'g', & & 'ghi', 'z', 'zy'] call io([character(80) :: 'a'//trim(name), 'ab', 'abc', 'd', & & 'def', 'g', 'ghi', 'z', 'zyxwvut']) print * abc = [character(80) :: 'a', 'ab', 'abc', 'd'//trim(name), 'def', 'g', & & 'ghi', 'z', 'zy'] call io([character(80) :: 'a', 'ab', 'abc', 'd'//trim(name), & & 'def', 'g', 'ghi', 'z', 'zyxwvut']) contains subroutine io (lines) implicit none character(*) lines(:) integer i do i = 1, size(lines) write(*,'(I0,A)') i, ' ' // trim(abc(i)) // ' ' // trim(lines(i)) end do end subroutine io end program ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/101871] Array of strings of different length passed as an argument produces invalid result. 2021-08-12 3:28 [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result david.sagan at gmail dot com 2021-08-12 16:05 ` [Bug fortran/101871] " kargl at gcc dot gnu.org @ 2021-08-12 18:43 ` anlauf at gcc dot gnu.org 2021-08-12 19:21 ` kargl at gcc dot gnu.org ` (3 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: anlauf at gcc dot gnu.org @ 2021-08-12 18:43 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871 anlauf at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |anlauf at gcc dot gnu.org --- Comment #2 from anlauf at gcc dot gnu.org --- PR85547 is likely related to this one. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/101871] Array of strings of different length passed as an argument produces invalid result. 2021-08-12 3:28 [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result david.sagan at gmail dot com 2021-08-12 16:05 ` [Bug fortran/101871] " kargl at gcc dot gnu.org 2021-08-12 18:43 ` anlauf at gcc dot gnu.org @ 2021-08-12 19:21 ` kargl at gcc dot gnu.org 2021-08-14 0:59 ` kargl at gcc dot gnu.org ` (2 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: kargl at gcc dot gnu.org @ 2021-08-12 19:21 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871 --- Comment #3 from kargl at gcc dot gnu.org --- (In reply to anlauf from comment #2) > PR85547 is likely related to this one. Yes, indeed. Looks like a duplicate. I checked that array.c(gfc_match_array_constructor) does the right things. So, someplace in the handling of gfc_arglist, gfortran is overriding the typespec set by the array with the typespec of the first element if that element is an expression. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/101871] Array of strings of different length passed as an argument produces invalid result. 2021-08-12 3:28 [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result david.sagan at gmail dot com ` (2 preceding siblings ...) 2021-08-12 19:21 ` kargl at gcc dot gnu.org @ 2021-08-14 0:59 ` kargl at gcc dot gnu.org 2021-08-15 19:21 ` anlauf at gcc dot gnu.org 2021-08-16 0:30 ` sgk at troutmask dot apl.washington.edu 5 siblings, 0 replies; 7+ messages in thread From: kargl at gcc dot gnu.org @ 2021-08-14 0:59 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871 --- Comment #4 from kargl at gcc dot gnu.org --- With this testcase, program tao_program implicit none integer i character(80) abc(9) character(1) n n = 'H' abc = [character(80) :: & & 'a'//n, 'ab', 'abc', 'd', 'def', 'g', 'ghi', 'z', 'zyxwvut'] call io([character(80) :: & & 'a'//n, 'ab', 'abc', 'd', 'def', 'g', 'ghi', 'z', 'zyxwvut']) contains subroutine io (lines) character(*) lines(:) integer i do i = 1, size(lines) write(*,'(I0,A)') i, ' ' // trim(abc(i)) // ' ' // trim(lines(i)) end do end subroutine io end program I find that the actual argument is correctly parsed. (gdb) p *tail->expr $12 = {expr_type = EXPR_ARRAY, ts = {type = BT_CHARACTER, kind = 1, u = { derived = 0x803422870, cl = 0x803422870, pad = 54667376}, interface = 0x0, is_c_interop = 0, is_iso_c = 0, f90_type = BT_UNKNOWN, deferred = false, interop_kind = 0x7fffffffd950}, rank = 1, shape = 0x0, symtree = 0x0, ref = 0x0, where = { nextc = 0x803431c2c, lb = 0x803431be0}, base_expr = 0x0, is_snan = 0, error = 0, user_operator = 0, mold = 0, must_finalize = 0, no_bounds_check = 0, external_blas = 0, do_not_resolve_again = 0, do_not_warn = 0, from_constructor = 0, representation = { length = 0, string = 0x0}, boz = {len = 0, rdx = 0, str = 0x0}, value = { logical = 54623680, iokind = 54623680, integer = {{_mp_alloc = 54623680, _mp_size = 8, _mp_d = 0x0}}, real = {{_mpfr_prec = 34414362048, _mpfr_sign = 0, _mpfr_exp = 0, _mpfr_d = 0x0}}, complex = {{re = {{_mpfr_prec = 34414362048, _mpfr_sign = 0, _mpfr_exp = 0, _mpfr_d = 0x0}}, im = {{_mpfr_prec = 0, _mpfr_sign = 0, _mpfr_exp = 0, _mpfr_d = 0x0}}}}, op = {op = 54623680, uop = 0x0, op1 = 0x0, op2 = 0x0}, function = {actual = 0x803417dc0, name = 0x0, isym = 0x0, esym = 0x0}, compcall = {actual = 0x803417dc0, name = 0x0, base_object = 0x0, tbp = 0x0, ignore_pass = 0, assign = 0}, character = {length = 34414362048, string = 0x0}, constructor = 0x803417dc0}, param_list = 0x0} (gdb) call debug(tail->expr) (/ (// 'a' tao_program:n) , 'ab' , 'abc' , 'd' , 'def' , 'g' , 'ghi' , 'z' , 'zyxwvut' /) (CHARACTER 80 1) (gdb) call debug(tail->expr->ts) (CHARACTER 80 1) Both the elements and the typespec are set correctly. So, when the actual argument is evaluate the first element is (// 'a' tao_program:n) which will have length of 2. This is then used for all other elements. Whoops. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/101871] Array of strings of different length passed as an argument produces invalid result. 2021-08-12 3:28 [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result david.sagan at gmail dot com ` (3 preceding siblings ...) 2021-08-14 0:59 ` kargl at gcc dot gnu.org @ 2021-08-15 19:21 ` anlauf at gcc dot gnu.org 2021-08-16 0:30 ` sgk at troutmask dot apl.washington.edu 5 siblings, 0 replies; 7+ messages in thread From: anlauf at gcc dot gnu.org @ 2021-08-15 19:21 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871 --- Comment #5 from anlauf at gcc dot gnu.org --- In array.c:gfc_match_array_constructor there's the following code: 1335 /* Walk the constructor, and if possible, do type conversion for 1336 numeric types. */ 1337 if (gfc_numeric_ts (&ts)) 1338 { 1339 m = walk_array_constructor (&ts, head); 1340 if (m == MATCH_ERROR) 1341 return m; 1342 } Steve, you were the last one to work on this block. It appears that non-numeric ts are not handled (here). Can you give some insight? ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/101871] Array of strings of different length passed as an argument produces invalid result. 2021-08-12 3:28 [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result david.sagan at gmail dot com ` (4 preceding siblings ...) 2021-08-15 19:21 ` anlauf at gcc dot gnu.org @ 2021-08-16 0:30 ` sgk at troutmask dot apl.washington.edu 5 siblings, 0 replies; 7+ messages in thread From: sgk at troutmask dot apl.washington.edu @ 2021-08-16 0:30 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871 --- Comment #6 from Steve Kargl <sgk at troutmask dot apl.washington.edu> --- On Sun, Aug 15, 2021 at 07:21:42PM +0000, anlauf at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101871 > > --- Comment #5 from anlauf at gcc dot gnu.org --- > In array.c:gfc_match_array_constructor there's the following code: > > 1335 /* Walk the constructor, and if possible, do type conversion for > 1336 numeric types. */ > 1337 if (gfc_numeric_ts (&ts)) > 1338 { > 1339 m = walk_array_constructor (&ts, head); > 1340 if (m == MATCH_ERROR) > 1341 return m; > 1342 } > > Steve, you were the last one to work on this block. > It appears that non-numeric ts are not handled (here). > Can you give some insight? > Unfortunately, I can't remember why it's confined to numeric types. I did the simply thing of commenting out the if-stmt and got an ICE. I also tried explicitly setting the typespec of each array element to the typespec of array constructor and that also ICE'd. I haven't had time to polk further. I think at some point the actual arg list is reduced to a formal argument list. This might loose the array constructor typespec when reducing/resolving the arg list. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-08-16 0:30 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-08-12 3:28 [Bug fortran/101871] New: Array of strings of different length passed as an argument produces invalid result david.sagan at gmail dot com 2021-08-12 16:05 ` [Bug fortran/101871] " kargl at gcc dot gnu.org 2021-08-12 18:43 ` anlauf at gcc dot gnu.org 2021-08-12 19:21 ` kargl at gcc dot gnu.org 2021-08-14 0:59 ` kargl at gcc dot gnu.org 2021-08-15 19:21 ` anlauf at gcc dot gnu.org 2021-08-16 0:30 ` sgk at troutmask dot apl.washington.edu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).