Fortran: ICE in gfc_code2string PR93792
authorSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 5 Mar 2020 11:41:14 +0000 (11:41 +0000)
committerMark Eggleston <markeggleston@gcc.gnu.org>
Thu, 5 Mar 2020 11:41:14 +0000 (11:41 +0000)
A BOZ constant can not appear as a component inialiser for a derived
type.

gcc/fortran/ChangeLog:

PR93792
* decl.c (variable_decl): If param and initializer check
for BOZ, if found,  output an error, set m to MATCH_ERROR
and goto cleanup.

gcc/testsuite/ChangeLog:

PR93792
* gfortran.dg/pr93792.f90:  New test.

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr93792.f90 [new file with mode: 0644]

index e3957fbac4dcccf96cdb88112cc1bc3e04d5c0cc..90e1cabbe2037efa176582b1cea3654ba0b64b82 100644 (file)
@@ -1,3 +1,10 @@
+2020-03-05 Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/93792
+       * decl.c (variable_decl): If param and initializer check
+       for BOZ, if found,  output an error, set m to MATCH_ERROR
+       and goto cleanup.
+
 2020-03-02  Andrew Benson  <abensonca@gmail.com>
 
        PR fortran/93486
index 7382fea03e4633d25530aeb912bc1e0998bdf9cc..2f458c4faac6f3a840e2fe869e2d495e13bb38db 100644 (file)
@@ -2929,7 +2929,16 @@ variable_decl (int elem)
          goto cleanup;
        }
       else if (param && initializer)
-       param->value = gfc_copy_expr (initializer);
+       {
+         if (initializer->ts.type == BT_BOZ)
+           {
+             gfc_error ("BOZ literal constant at %L cannot appear as an "
+                        "initializer", &initializer->where);
+             m = MATCH_ERROR;
+             goto cleanup;
+           }
+         param->value = gfc_copy_expr (initializer);
+       }
     }
 
   /* Before adding a possible initilizer, do a simple check for compatibility
index 7dcc80d08510070679e47318da4eeed21733e8a1..851e0e9280716da4b0065fcefdcc63a8e2b39bd4 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-05 Mark Eggleston  <mark.eggleston@codethink.com>
+
+       PR fortran/93792
+       * gfortran.dg/pr93792.f90:  New test.
+
 2020-03-05  Delia Burduv  <delia.burduv@arm.com>
 
        * gcc.target/arm/simd/bf16_ma_1.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr93792.f90 b/gcc/testsuite/gfortran.dg/pr93792.f90
new file mode 100644 (file)
index 0000000..960d050
--- /dev/null
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! Original test case by Gernhard Steinmetz.
+
+module m
+   type t(n)
+      integer, len :: n = z'1'
+   end type
+end
+program p
+   use m
+   type(t(:)), allocatable :: z
+end
+
+! { dg-error "Parameterized type 't' does not have a component"  " " { target *-*-* } 5 }
+! { dg-error "BOZ literal constant at .1. cannot appear"  " " { target *-*-* } 6 }
+! { dg-error "Cannot open module file"  " " { target *-*-* } 10 }
+! { dg-excess-errors "compilation terminated" }