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