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  <anl...@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  <anl...@gmx.de>

        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

Reply via email to