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

2019-02-17 Thread Harald Anlauf
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
> 



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

2019-02-17 Thread Thomas Koenig

Hi Harald,


OK for trunk?


OK.

Thanks for the patch!

Regards

Thomas


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

2019-02-15 Thread Harald Anlauf
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  

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  

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

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;
+   }
 }
 }
 
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