diff options
author | Harald Anlauf <anlauf@gmx.de> | 2019-02-17 21:14:14 +0000 |
---|---|---|
committer | Harald Anlauf <anlauf@gcc.gnu.org> | 2019-02-17 21:14:14 +0000 |
commit | e6ca33ba57dd55357cf2fd97c81fd12daca465a3 (patch) | |
tree | 149a62d2ada8627643ce242bbdef6b206fabdebe /gcc | |
parent | dc20515ee57df80372f0f55011a67811ce82053e (diff) | |
download | gcc-e6ca33ba57dd55357cf2fd97c81fd12daca465a3.zip gcc-e6ca33ba57dd55357cf2fd97c81fd12daca465a3.tar.gz gcc-e6ca33ba57dd55357cf2fd97c81fd12daca465a3.tar.bz2 |
re PR fortran/89077 (ICE using * as len specifier for character parameter)
2019-02-17 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.
PR fortran/89077
* gfortran.dg/transfer_simplify_12.f90: New test.
From-SVN: r268973
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/transfer_simplify_12.f90 | 27 |
4 files changed, 46 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index fb01bf1..aa474a4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-02-17 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-16 Jakub Jelinek <jakub@redhat.com> PR middle-end/88074 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 4393287..3658e43 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1754,6 +1754,14 @@ gfc_set_constant_character_len (gfc_charlen_t len, gfc_expr *expr, 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; + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1e4d967..6b2ffa3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-02-17 Harald Anlauf <anlauf@gmx.de> + + PR fortran/89077 + * gfortran.dg/transfer_simplify_12.f90: New test. + 2019-02-17 Marek Polacek <polacek@redhat.com> PR c++/89217 - ICE with list-initialization in range-based for loop. diff --git a/gcc/testsuite/gfortran.dg/transfer_simplify_12.f90 b/gcc/testsuite/gfortran.dg/transfer_simplify_12.f90 new file mode 100644 index 0000000..344b3ae --- /dev/null +++ b/gcc/testsuite/gfortran.dg/transfer_simplify_12.f90 @@ -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 |