diff mbox series

[PR,fortran/89077,part,3] - ICE using * as len specifier for character parameter

Message ID 5C6724D5.9080809@gmx.de
State New
Headers show
Series [PR,fortran/89077,part,3] - ICE using * as len specifier for character parameter | expand

Commit Message

Harald Anlauf Feb. 15, 2019, 8:45 p.m. UTC
The attached patch is the third in a series for the above PR.
This one fixes erroneous padding with garbage characters in some
declaration and initialization expressions.

The issue here was that expr->representation is set when either
Hollerith strings are used or a TRANSFER statement is involved.
As a result, the original string could be used with trailing
garbage instead of the properly space-padded string.  The patch
simply clears expr->representation in that case.

Regtested on x86_64-pc-linux-gnu.

OK for trunk?

Thanks,
Harald

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

	PR fortran/89077
	* decl.c (gfc_set_constant_character_len): Clear original string
	representation after padding has been performed to target length.

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

	PR fortran/89077
	* gfortran.dg/transfer_simplify_12.f90: New test.

Index: gcc/testsuite/gfortran.dg/transfer_simplify_12.f90
===================================================================
--- gcc/testsuite/gfortran.dg/transfer_simplify_12.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/transfer_simplify_12.f90	(working copy)
@@ -0,0 +1,27 @@
+! { dg-do run }
+! { dg-options "-O -std=legacy" }
+!
+! Test fixes for some findings while resolving PR fortran/89077
+
+program test
+  implicit none
+  integer :: i
+  character(*)  ,parameter :: s =  'abcdef'   ! Length will be 6
+  character(*)  ,parameter :: h = 6Habcdef    ! Length will be 8 (Hollerith!)
+  character(10) ,parameter :: k = 6Habcdef
+  character(10) ,parameter :: t = transfer (s, s)
+  character(10) ,save      :: u = transfer (s, s)
+  character(10) ,parameter :: v = transfer (h, h)
+  character(10) ,save      :: w = transfer (h, h)
+  character(10) ,parameter :: x = transfer ([(s(i:i),i=len(s),1,-1)], s)
+  character(10) ,save      :: y = transfer ([(s(i:i),i=len(s),1,-1)], s)
+  if (len (h) /= 8) stop 1
+  if (h /= s) stop 2
+  if (k /= s) stop 3
+  if (t /= s) stop 4
+  if (u /= s) stop 5
+  if (v /= s) stop 6
+  if (w /= s) stop 7
+  if (x /= "fedcba") stop 8
+  if (y /= x) stop 9
+end program test

Comments

Thomas Koenig Feb. 17, 2019, 8:45 p.m. UTC | #1
Hi Harald,

> OK for trunk?

OK.

Thanks for the patch!

Regards

	Thomas
Harald Anlauf Feb. 17, 2019, 9:15 p.m. UTC | #2
Committed as rev. 268973.

Thanks for the review!

Harald

On 02/17/19 21:45, Thomas Koenig wrote:
> Hi Harald,
> 
>> OK for trunk?
> 
> OK.
> 
> Thanks for the patch!
> 
> Regards
> 
>     Thomas
>
diff mbox series

Patch

Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c	(revision 268946)
+++ gcc/fortran/decl.c	(working copy)
@@ -1754,6 +1754,14 @@ 
       free (expr->value.character.string);
       expr->value.character.string = s;
       expr->value.character.length = len;
+      /* If explicit representation was given, clear it
+	 as it is no longer needed after padding.  */
+      if (expr->representation.length)
+	{
+	  expr->representation.length = 0;
+	  free (expr->representation.string);
+	  expr->representation.string = NULL;
+	}
     }
 }