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?
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 ?-(
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
Fixed. Thanks for the report. Paul