https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84120
Bug ID: 84120 Summary: Syntax for used for PDT constructors is incorrect Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: neil.n.carlson at gmail dot com Target Milestone: --- Consider the PDT type foo(dim) integer,len :: dim integer :: array(dim) end type While investigating how other compilers do on the gfortran testsuite programs, I discovered that gfortran would use the following syntax for a constructor for the PDT: type(foo(2)) :: x x = foo(2,[1,2]) This is absolutely wrong. The correct constructor syntax is x = foo(2)([1,2]) The PDT implementation appears to have the misconception that type parameters are (in part) regular components, but that is not so, they are two separate things. See PR84119 for some related references to the standard. In particular here, see R455 for the constructor syntax (F08 standard), and R453 for the derived-type-spec (e.g. "foo(2)"). Note that 1.3.33 defines what a "component" is, and it does not include type parameters. To summarize, gfortran works with this invalid example (Intel and NAG properly reject it) type foo(dim) integer,len :: dim integer :: array(dim) end type type(foo(:)), allocatable :: x x = foo(2,[1,2]) if (size(x%array) /= 2) stop 1 if (any(x%array /= [1,2])) stop 2 end But gfortran rejects this corrected valid example (works with Intel and NAG): type foo(dim) integer,len :: dim integer :: array(dim) end type type(foo(:)), allocatable :: x x = foo(2)([1,2]) if (size(x%array) /= 2) stop 1 if (any(x%array /= [1,2])) stop 2 end x = foo(2)([1,2]) 1 Error: Invalid character in name at (1)