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