Bug 103414 - [11/12/13/14 Regression] [PDT] ICE in gfc_free_actual_arglist, at fortran/expr.c:547 since r10-2083-g8dc63166e0b85954
Summary: [11/12/13/14 Regression] [PDT] ICE in gfc_free_actual_arglist, at fortran/exp...
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 12.0
: P4 normal
Target Milestone: 11.5
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-on-invalid-code
Depends on:
Blocks: PDT
  Show dependency treegraph
 
Reported: 2021-11-24 17:47 UTC by G. Steinmetz
Modified: 2023-07-07 10:41 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2023-06-30 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description G. Steinmetz 2021-11-24 17:47:31 UTC
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
Comment 1 G. Steinmetz 2021-11-24 21:54:55 UTC
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
Comment 2 kargls 2021-11-25 01:07:20 UTC
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)
Comment 3 kargls 2021-11-25 01:10:51 UTC
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.
Comment 4 kargls 2021-11-25 01:39:11 UTC
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;
Comment 5 Martin Liška 2021-11-25 09:56:53 UTC
Started with r10-2083-g8dc63166e0b85954.
Comment 6 kargls 2021-11-25 15:51:51 UTC
(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.
Comment 7 Jakub Jelinek 2022-06-28 10:47:12 UTC
GCC 10.4 is being released, retargeting bugs to GCC 10.5.
Comment 8 kargls 2022-06-28 14:57:29 UTC
(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.
Comment 9 Paul Thomas 2023-06-30 08:38:34 UTC
Added to PDT meta-bug
Comment 10 Richard Biener 2023-07-07 10:41:37 UTC
GCC 10 branch is being closed.