diff mbox series

[committed,Fortran] avoid ICE in gfc_omp_check_optional_argument (PR93464)

Message ID 6630bf5a-204e-be48-a6d8-645ccd2adc99@codesourcery.com
State New
Headers show
Series [committed,Fortran] avoid ICE in gfc_omp_check_optional_argument (PR93464) | expand

Commit Message

Tobias Burnus Jan. 28, 2020, 11:05 a.m. UTC
(This was a GCC 10 regression, affecting both OpenMP and OpenACC.)

In gfc_omp_check_optional_argument:

DECL_LANG_SPECIFIC is always available (check at the top). However, if 
decl is not a PARM_DECL, it can have two reasons: Either it is no 
parameter (C sense; Fortran: dummy argument) at all or – as gfortran 
does for assumed-shape arrays – it is a locally defined decl which 
belongs to the array parameter. In the latter case, 
GFC_DECL_SAVED_DESCRIPTOR contains the actual PARAM_DECL.

Well, as this test case shows, the GFC_DESCRIPTOR_TYPE_P condition is 
fulfilled, but as it is a locally defined variable, 
GFC_DECL_SAVED_DESCRIPTOR is NULL.

The reason that it didn't show up before is that most of the local 
arrays do not have DECL_LANG_SPECIFIC – this one does because it is a 
character string (used for the string length).

Applied as obvious after building and regtesting.

Cheers,

Tobias
diff mbox series

Patch

commit 627d59b6b3062de921fbdd80b2b48de18f599d03
Author: Tobias Burnus <tobias@codesourcery.com>
Date:   Tue Jan 28 11:54:57 2020 +0100

    [Fortran] avoid ICE in gfc_omp_check_optional_argument (PR93464)
    
            PR fortran/93464
            * openmp.c (gfc_omp_check_optional_argument): Avoid ICE when
            DECL_LANG_SPECIFIC and GFC_DESCRIPTOR_TYPE_P but not
            GFC_DECL_SAVED_DESCRIPTOR as for local allocatable character vars.
    
            PR fortran/93464
            * gfortran.dg/goacc/pr93464.f90: New.

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 4040ff284b3..eb8842b0ab8 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,9 +1,16 @@ 
+2020-01-28  Tobias Burnus  <tobias@codesourcery.com>
+
+	PR fortran/93464
+	* openmp.c (gfc_omp_check_optional_argument): Avoid ICE when
+	DECL_LANG_SPECIFIC and GFC_DESCRIPTOR_TYPE_P but not
+	GFC_DECL_SAVED_DESCRIPTOR as for local allocatable character vars.
+
 2020-01-28  Tobias Burnus  <tobias@codesourcery.com>
 
 	* gfortran.texi (Runtime): Remove tailing '.' in @menu.
 
 2020-01-27  Tobias Burnus  <tobias@codesourcery.com>
 
 	PR fortran/85781
 	* trans-expr.c (gfc_conv_substring): Handle non-ARRAY_TYPE strings
 	of Bind(C) procedures.
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index fd60bbbed5d..66669550499 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -95,19 +95,20 @@  gfc_omp_check_optional_argument (tree decl, bool for_present_check)
   /* For assumed-shape arrays, a local decl with arg->data is used.  */
   if (TREE_CODE (decl) != PARM_DECL
       && (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
 	  || GFC_ARRAY_TYPE_P (TREE_TYPE (decl))))
     {
       is_array_type = true;
       decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
     }
 
-  if (TREE_CODE (decl) != PARM_DECL
+  if (decl == NULL_TREE
+      || TREE_CODE (decl) != PARM_DECL
       || !DECL_LANG_SPECIFIC (decl)
       || !GFC_DECL_OPTIONAL_ARGUMENT (decl))
     return NULL_TREE;
 
    /* Scalars with VALUE attribute which are passed by value use a hidden
       argument to denote the present status.  They are passed as nonpointer type
       with one exception: 'type(c_ptr), value' as 'void*'.  */
    /* Cf. trans-expr.c's gfc_conv_expr_present.  */
    if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eac18206b12..d9441cb0a2e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,9 +1,14 @@ 
+2020-01-28  Tobias Burnus  <tobias@codesourcery.com>
+
+	PR fortran/93464
+	* gfortran.dg/goacc/pr93464.f90: New.
+
 2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
 
 	PR tree-optimization/93434
 	* gcc.c-torture/execute/pr93434.c: New test.
 
 2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
 
 	PR testsuite/93460
 	* gcc.dg/torture/pr93170.c: Add -Wpsabi.
diff --git a/gcc/testsuite/gfortran.dg/goacc/pr93464.f90 b/gcc/testsuite/gfortran.dg/goacc/pr93464.f90
new file mode 100644
index 00000000000..922106540f9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/pr93464.f90
@@ -0,0 +1,16 @@ 
+! { dg-do compile }
+!
+! PR fortran/93464
+!
+! Contributed by G. Steinmetz
+!
+program p
+   character :: c(2) = 'a'
+   character, allocatable :: z(:)
+   !$acc parallel
+   !$omp target
+   z = c
+   !$acc end parallel
+   !$omp end target
+   print *, z
+end