Started with r10, between 20190630 and 20190728 : $ cat z1.f90 program p type t(n) integer, kind :: n character(n) :: c = '' end type type(t(3)) :: x = t(z'1') end $ cat z2.f90 program p type t(n) integer, kind :: n character(n) :: c = '' end type type(t(3)) :: x(1) = [t(z'1')] end $ gfortran-12-20211121 -c z2.f90 z2.f90:6:33: 6 | type(t(3)) :: x(1) = [t(z'1')] | 1 Error: The parameter expression at (1) must be of INTEGER type and not BOZ type # hangs ... $ gfortran-12-20211121 -c z1.f90 *** Error in `.../gcc/x86_64-pc-linux-gnu/12.0.0/f951': double free or corruption (fasttop): 0x000000000298bdf0 *** f951: internal compiler error: Aborted 0xd6009f crash_signal ../../gcc/toplev.c:322 0x79965c gfc_free_actual_arglist(gfc_actual_arglist*) ../../gcc/fortran/expr.c:547 0x788c66 gfc_match_data_decl() ../../gcc/fortran/decl.c:6340 0x7f3df3 match_word ../../gcc/fortran/parse.c:67 0x7f3df3 decode_statement ../../gcc/fortran/parse.c:378 0x7f583a next_free ../../gcc/fortran/parse.c:1397 0x7f583a next_statement ../../gcc/fortran/parse.c:1629 0x7f6f5b parse_spec ../../gcc/fortran/parse.c:4168 0x7fa2bc parse_progunit ../../gcc/fortran/parse.c:6179 0x7fb5a1 gfc_parse_file() ../../gcc/fortran/parse.c:6724 0x848a6f gfc_be_parse_file ../../gcc/fortran/f95-lang.c:216
Right, primarily PDT specific. Modified cases with deleted "z" should be treated first. That changed with the PDT groundwork in r8 before 20180525. $ cat z3.f90 program p type t(n) integer, kind :: n character(n) :: c = '' end type type(t(3)) :: x = t('1') end
This one took a bit to find where to check for a BOZ. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 705d2326a29..7add59f50bd 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1268,6 +1274,17 @@ resolve_structure_cons (gfc_expr *expr, int init) else resolve_fl_struct (expr->ts.u.derived); + /* Walk the constructor looking for an invalid BOZ. */ + cons = gfc_constructor_first (expr->value.constructor); + for (; cons; cons = gfc_constructor_next (cons)) + if (cons->expr && cons->expr->ts.type == BT_BOZ) + { + gfc_error ("boz-literal-constant at %L cannot appear as an " + "entity in a structure constructor", + &cons->expr->where); + return false; + } + /* If this is a Parameterized Derived Type template, find the instance corresponding to the PDT kind parameters. */ if (expr->ts.u.derived->attr.pdt_template)
The patch in comment #2 does not address the issue in comment #1. The patch only address an invalid BOZ in a structure constructor. The issue in comment #1 is technical unrelated.
This fixes/catches the type mismatch in the issue raised in comment #1. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 705d2326a29..0a864da015b 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1231,9 +1237,17 @@ get_pdt_constructor (gfc_expr *expr, gfc_constructor **constr, if (!t) return t; } - else if ((comp->attr.pdt_kind || comp->attr.pdt_len) + else if ((comp->attr.pdt_kind || comp->attr.pdt_len) && derived->attr.pdt_template) { + if (comp->ts.type != cons->expr->ts.type) + { + gfc_error ("Type mismatch for a type parameter and an entity " + "at %L in the structure constructor", + &cons->expr->where); + return false; + } + t = get_pdt_spec_expr (comp, cons->expr); if (!t) return t;
Started with r10-2083-g8dc63166e0b85954.
(In reply to Martin Liška from comment #5) > Started with r10-2083-g8dc63166e0b85954. Well, no, it did not start with the above commit. At best, it was exposed by this commit.
GCC 10.4 is being released, retargeting bugs to GCC 10.5.
(In reply to Jakub Jelinek from comment #7) > GCC 10.4 is being released, retargeting bugs to GCC 10.5. That's a shame. The patches in comments in 2 and 4 where submitted over 8 months ago.
Added to PDT meta-bug
GCC 10 branch is being closed.