This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PING: [patch, fortran] PR 27997: Implement F2003-style array constructor with typespec


FX wrote:
I am wondering: could you add some testcases with failing conversion to the constructor type. I see four cases I'd like covered: a too long string, like that:

write *, [ character(len=1) :: "I am too long", "me too" ]
I fail to see why this should fail. I think this is perfectly valid and equivalent to ['I', 'm']; the point of the constructor is too allow items which have different lengths. If they had all the same length, there were no need for the typespec (in this case).

and a value that doesn't fit in the constructor type, like that:

write *, [ integer(4) :: huge(0_8) ]
I think one could add a range check here; with -fno-range-check it should compile (and give with -Wconversion a warning), but with -frange-check (= default) a overflow error should be printed.

Also, I think we should also include a testcase with derived types:
Agreed.

And constructors withing constructors, like this:
print *, [ integer(kind=8) :: 4, [ integer(kind=4) :: 42, 12 ] ]
print *, [ character(len=8) :: "foo", [ character(len=4) :: "bar", "gee" ] ]
I think this fails currently - at least for strings, possibly also with -fbounds-check and other types; cf. PR35846. I think one problem are global variables. Note the test case in the PR is without typespecs.

My suggestion is to get this patch in first and fix then the nested constructors for inclusing typespec. One probably should add your tests to the PR.

 static void
 gfc_trans_array_ctor_element (stmtblock_t * pblock, tree desc,
@@ -999,7 +1000,7 @@
-      if (flag_bounds_check)
+      if (flag_bounds_check && !typespec_ctor)

I've tried to trigger that code and could not see it work. I cannot see a runtime error, neither with
call test ("this is long")
contains
subroutine test(s)
character(len=*) :: s
print *, [ character(len=3) :: s, "foo" ]
I believe this program is valid and thus there should not be any run-time error. This is similarly to:

  character(len=5) :: a
  a = 'foo'
  a = 'foobar'

All of these are valid. For the first assignment the 'foo' is padded on the right giving 'foo ' and for the second one it is truncated and giving 'fooba'. There is no reason why constructors with typespec should be different. Note also that there is in the Fortran 2003 standard the following example:
(/ CHARACTER(LEN=7) :: âTakataâ, âTanakaâ, âHayashiâ /)
which has a similar "problem": The first two names are too short. Without the typespec the example were invalid as then all items have to have the same length. [Without the typespec the compiler does not know which length is the right one - six such as for "Takata" or seven as for "Hayashi"; with -fbounds-checks gfortran prints an error in this case.]


Tobias


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]