Bug 82978 - [PDT] [F2003] Paramaterized Derived Type LEN parameters take the latest value per-kind
Summary: [PDT] [F2003] Paramaterized Derived Type LEN parameters take the latest value...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 8.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks: PDT
  Show dependency treegraph
 
Reported: 2017-11-14 02:11 UTC by Fritz Reese
Modified: 2017-12-01 15:10 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2017-11-14 00:00:00


Attachments
test case exhibiting strange PDT behavior (230 bytes, text/plain)
2017-11-14 02:11 UTC, Fritz Reese
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Fritz Reese 2017-11-14 02:11:20 UTC
Created attachment 42596 [details]
test case exhibiting strange PDT behavior

In the attached file I see what I believe is unusual behavior. I skimmed the F03/F08 specs and by all accounts I could see, this behavior is unexpected.

To summarize/generalize the test file, with the following declarations:

> type :: pdt_t(k, l)
> integer, kind :: k
> integer, len :: l
> character(len=l) :: ch
> end type
> 
> type(pdt_t(k, l1)) :: t1
> type(pdt_t(k, l2)) :: t2
> ...
> type(pdt_t(k, ln)) :: tn

Then I see that len(t1%ch) == len(t2%ch) == ... == len(tn%ch) == ln. That is to say, every PDT variable gets ch with the last length defined for the same kind. If different kinds are passed, then the lengths seem to differ fine.

Here is my output for the attached file:

$ gfortran --version
GNU Fortran (GCC) 8.0.0 20171107 (experimental)
[...]
$ gfortran pdtlens.f03
$ ./a.out
 exp. len	act. len
           1           2
           2           2
           4           5
           5           5
           9           7
           7           7
         100         200
         200         200


Am I just misinterpreting the Fortran spec, or is this a real bug?
Comment 1 Dominique d'Humieres 2017-11-14 10:31:25 UTC
The test shows two problems with PDT:

(1) The kind of the character is not taken into account:

Adding the line

print *, kind(w1%chr), kind(x1%chr), kind(y1%chr), kind(z1%chr)

gives

           1           1           1           1

As a consequence the KINDs 2 and 8 are not properly rejected.

(2) The length is not properly set if there is more than one character PDT with the same kind:

implicit none

type :: pdt_t(k, l)
  integer, kind :: k
  integer, len :: l
  character(kind=k,len=l) :: chr
end type

type(pdt_t(1, 4))   :: x1
type(pdt_t(1, 5))   :: x2
type(pdt_t(1, 6))   :: x3

print *, 'exp. len	act. len'
print *, x1%l, len(x1%chr)
print *, x2%l, len(x2%chr)
print *, x3%l, len(x3%chr)

end

gives

 exp. len	act. len
           4           6
           5           6
           6           6

but I fail to see the logic:

type(pdt_t(1, 4))   :: x1
type(pdt_t(1, 6))   :: x3
type(pdt_t(1, 50))   :: x2
...
print *, x3%l, len(x3%chr)
print *, x1%l, len(x1%chr)
print *, x2%l, len(x2%chr)

gives

           6           6
           4           6
          50           6

?-(
Comment 2 Paul Thomas 2017-12-01 15:06:27 UTC
Author: pault
Date: Fri Dec  1 15:05:55 2017
New Revision: 255311

URL: https://gcc.gnu.org/viewcvs?rev=255311&root=gcc&view=rev
Log:
2017-12-01  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/82605
	* resolve.c (get_pdt_constructor): Initialize 'cons' to NULL.
	(resolve_pdt): Correct typo in prior comment. Emit an error if
	any parameters are deferred and the object is neither pointer
	nor allocatable.

	PR fortran/82606
	* decl.c (gfc_get_pdt_instance): Continue if the parameter sym
	is not present or has no name. Select the parameter by name
	of component, rather than component order. Remove all the other
	manipulations of 'tail' when building the pdt instance.
	(gfc_match_formal_arglist): Emit and error if a star is picked
	up in a PDT decl parameter list.

	PR fortran/82622
	* trans-array.c (set_loop_bounds): If a GFC_SS_COMPONENT has an
	info->end, use it rather than falling through to
	gcc_unreachable.
	(structure_alloc_comps): Check that param->name is non-null
	before comparing with the component name.
	* trans-decl.c (gfc_get_symbol_decl): Do not use the static
	initializer for PDT symbols.
	(gfc_init_default_dt): Do nothing for PDT symbols.
	* trans-io.c (transfer_array_component): Parameterized array
	components use the descriptor ubound since the shape is not
	available.

	PR fortran/82719
	PR fortran/82720
	* trans-expr.c (gfc_conv_component_ref): Do not use the charlen
	backend_decl of pdt strings. Use the hidden component instead.
	* trans-io.c (transfer_expr): Do not do IO on "hidden" string
	lengths. Use the hidden string length for pdt string transfers
	by adding it to the se structure. When finished nullify the
	se string length.

	PR fortran/82866
	* decl.c (gfc_match_formal_arglist): If a name is not found or
	star is found, while reading a type parameter list, emit an
	immediate error.
	(gfc_match_derived_decl): On reading a PDT parameter list, on
	failure to match call gfc_error_recovery.

	PR fortran/82978
	* decl.c (build_struct): Character kind defaults to 1, so use
	kind_expr whatever is the set value.
	(gfc_get_pdt_instance): Ditto.
	* trans-array.c (structure_alloc_comps): Copy the expression
	for the PDT string length before parameter substitution. Use
	this expression for evaluation and free it after use.

2017-12-01  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/82605
	* gfortran.dg/pdt_4.f03 : Incorporate the new error.

	PR fortran/82606
	* gfortran.dg/pdt_19.f03 : New test.
	* gfortran.dg/pdt_21.f03 : New test.

	PR fortran/82622
	* gfortran.dg/pdt_20.f03 : New test.
	* gfortran.dg/pdt_22.f03 : New test.

	PR fortran/82719
	PR fortran/82720
	* gfortran.dg/pdt_23.f03 : New test.

	PR fortran/82866
	* gfortran.dg/pdt_24.f03 : New test.

	PR fortran/82978
	* gfortran.dg/pdt_10.f03 : Correct for error in coding the for
	kind 4 component and change the kind check appropriately.
	* gfortran.dg/pdt_25.f03 : New test.


Added:
    trunk/gcc/testsuite/gfortran.dg/pdt_19.f03
    trunk/gcc/testsuite/gfortran.dg/pdt_20.f03
    trunk/gcc/testsuite/gfortran.dg/pdt_21.f03
    trunk/gcc/testsuite/gfortran.dg/pdt_22.f03
    trunk/gcc/testsuite/gfortran.dg/pdt_23.f03
    trunk/gcc/testsuite/gfortran.dg/pdt_24.f03
    trunk/gcc/testsuite/gfortran.dg/pdt_25.f03
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/decl.c
    trunk/gcc/fortran/resolve.c
    trunk/gcc/fortran/trans-array.c
    trunk/gcc/fortran/trans-decl.c
    trunk/gcc/fortran/trans-expr.c
    trunk/gcc/fortran/trans-io.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gfortran.dg/pdt_10.f03
    trunk/gcc/testsuite/gfortran.dg/pdt_4.f03
Comment 3 Paul Thomas 2017-12-01 15:10:52 UTC
Fixed. Thanks for the report.

Paul