re PR fortran/89077 (ICE using * as len specifier for character parameter)
authorHarald Anlauf <anlauf@gmx.de>
Sun, 17 Feb 2019 21:14:14 +0000 (21:14 +0000)
committerHarald Anlauf <anlauf@gcc.gnu.org>
Sun, 17 Feb 2019 21:14:14 +0000 (21:14 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/transfer_simplify_12.f90 [new file with mode: 0644]

index fb01bf12aa8f4c4c3e940d64928c66690696cac6..aa474a44160c7c6f11a9a4ebb89d369e9f95a399 100644 (file)
@@ -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
index 4393287e1f1c0937194dca01e2882fba7072a898..3658e432e7cee4c1c172a9723674c5700bf25e8a 100644 (file)
@@ -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;
+       }
     }
 }
 
index 1e4d9670af022f64afcd39ca633c842efa80bb4f..6b2ffa3f02249a50f62f8b4c49dd0d181c2afa08 100644 (file)
@@ -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 (file)
index 0000000..344b3ae
--- /dev/null
@@ -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