[gcc(refs/vendors/ibm/heads/perf)] Fortran: ICE in gfc_code2string PR93792

Jiu Fu Guo guojiufu@gcc.gnu.org
Thu Mar 19 06:08:19 GMT 2020


https://gcc.gnu.org/g:a2ec7c4aafbcd517eb563f1df32eedf39b27141b

commit a2ec7c4aafbcd517eb563f1df32eedf39b27141b
Author: Steven G. Kargl <kargl@gcc.gnu.org>
Date:   Thu Mar 5 11:41:14 2020 +0000

    Fortran: ICE in gfc_code2string PR93792
    
    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.

Diff:
---
 gcc/fortran/ChangeLog                 |  7 +++++++
 gcc/fortran/decl.c                    | 11 ++++++++++-
 gcc/testsuite/ChangeLog               |  5 +++++
 gcc/testsuite/gfortran.dg/pr93792.f90 | 17 +++++++++++++++++
 4 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e3957fbac4d..90e1cabbe20 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 7382fea03e4..2f458c4faac 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7dcc80d0851..851e0e92807 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..960d05025ab
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr93792.f90
@@ -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" }


More information about the Gcc-cvs mailing list