[PR,fortran/89516] - ICE in gfc_calculate_transfer_sizes at gcc/fortran/check.c:5506

Message ID 5C771331.4000909@gmx.de
State New
Headers show
Series
  • [PR,fortran/89516] - ICE in gfc_calculate_transfer_sizes at gcc/fortran/check.c:5506
Related show

Commit Message

Harald Anlauf Feb. 27, 2019, 10:46 p.m.
Adding -Wsurprising as option to gfortran exercised a code path
that I hadn't seen when working on simplifications for the TRANSFER
intrinsic.  While regtesting, I realized that one of the checks was
too strict when the MOLD argument was scalar and of size 0 and should
only apply to array arguments.  I adjusted the corresponding testcase.

Regtested on x86_64-pc-linux-gnu.

OK for trunk?

Harald

2019-02-27  Harald Anlauf  <anlauf@gmx.de>

	PR fortran/89516
	* check.c (gfc_calculate_transfer_sizes): Correct checks for cases
	where storage size of elements of MOLD is 0.

2019-02-27  Harald Anlauf  <anlauf@gmx.de>

	PR fortran/89516
	* gfortran.dg/pr89492.f90: Adjust testcase.
	* gfortran.dg/transfer_check_5.f90: New test.

Comments

Thomas Koenig March 2, 2019, 3:17 p.m. | #1
Hi Harald,

> Adding -Wsurprising as option to gfortran exercised a code path

> that I hadn't seen when working on simplifications for the TRANSFER

> intrinsic.  While regtesting, I realized that one of the checks was

> too strict when the MOLD argument was scalar and of size 0 and should

> only apply to array arguments.  I adjusted the corresponding testcase.

> 

> Regtested on x86_64-pc-linux-gnu.

> 

> OK for trunk?


OK.

Thanks for the patch!

Regards

	Thomas
Harald Anlauf March 2, 2019, 3:30 p.m. | #2
Committed as rev. 269341 on trunk.

On 03/02/19 16:17, Thomas Koenig wrote:
> Hi Harald,

> 

>> Adding -Wsurprising as option to gfortran exercised a code path

>> that I hadn't seen when working on simplifications for the TRANSFER

>> intrinsic.  While regtesting, I realized that one of the checks was

>> too strict when the MOLD argument was scalar and of size 0 and should

>> only apply to array arguments.  I adjusted the corresponding testcase.

>>

>> Regtested on x86_64-pc-linux-gnu.

>>

>> OK for trunk?

> 

> OK.

> 

> Thanks for the patch!

> 

> Regards

> 

>     Thomas

>

Patch

Index: gcc/fortran/check.c
===================================================================
--- gcc/fortran/check.c	(revision 269264)
+++ gcc/fortran/check.c	(working copy)
@@ -5487,23 +5487,29 @@ 
   if (!gfc_element_size (mold, &result_elt_size))
     return false;
 
-  if (result_elt_size == 0 && *source_size > 0)
+  /* If the storage size of SOURCE is greater than zero and MOLD is an array,
+   * a scalar with the type and type parameters of MOLD shall not have a
+   * storage size equal to zero.
+   * If MOLD is a scalar and SIZE is absent, the result is a scalar.
+   * If MOLD is an array and SIZE is absent, the result is an array and of
+   * rank one. Its size is as small as possible such that its physical
+   * representation is not shorter than that of SOURCE.
+   * If SIZE is present, the result is an array of rank one and size SIZE.
+   */
+  if (result_elt_size == 0 && *source_size > 0 && !size
+      && mold->expr_type == EXPR_ARRAY)
     {
-      gfc_error ("%<MOLD%> argument of %<TRANSFER%> intrinsic at %L "
-                 "shall not have storage size 0 when %<SOURCE%> "
+      gfc_error ("%<MOLD%> argument of %<TRANSFER%> intrinsic at %L is an "
+		 "array and shall not have storage size 0 when %<SOURCE%> "
 		 "argument has size greater than 0", &mold->where);
       return false;
     }
 
-  /* If MOLD is a scalar and SIZE is absent, the result is a scalar.
-   * If MOLD is an array and SIZE is absent, the result is an array and of
-   * rank one. Its size is as small as possible such that its physical
-   * representation is not shorter than that of SOURCE.
-   */
   if (result_elt_size == 0 && *source_size == 0 && !size)
     {
       *result_size = 0;
-      *result_length_p = 0;
+      if (result_length_p)
+	*result_length_p = 0;
       return true;
     }