]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/59906 (error: size of variable '<anonymous>' is too large)
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 1 Feb 2014 18:50:41 +0000 (18:50 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 1 Feb 2014 18:50:41 +0000 (18:50 +0000)
2014-02-01  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/59906
* trans-stmt.c (gfc_add_loop_ss_code): In the case of character
SS_REFERENCE, use gfc_conv_string_parameter to ensure that a
pointer to the string is stored.
* trans-expr.c (gfc_conv_expr_reference): Likewise, use
gfc_conv_string_parameter to ensure that a pointer to is passed
to the elemental function.

2014-02-01  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/59906
* gfortran.dg/elemental_subroutine_9.f90 : New test

From-SVN: r207389

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/elemental_subroutine_9.f90 [new file with mode: 0644]

index 577d7784d2c346385b0b65edfe8cf11ecaac7864..5e3a48a65d79f2784474716b9b87b72b1e5daa01 100644 (file)
@@ -1,3 +1,13 @@
+2014-02-01  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/59906
+       * trans-stmt.c (gfc_add_loop_ss_code): In the case of character
+       SS_REFERENCE, use gfc_conv_string_parameter to ensure that a
+       pointer to the string is stored.
+       * trans-expr.c (gfc_conv_expr_reference): Likewise, use
+       gfc_conv_string_parameter to ensure that a pointer to is passed
+       to the elemental function.
+
 2014-01-28  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/59414
index 0f5375dba950d8182ad848e18789d0f8c5ff11dc..8e7b75ed601f6b39338771ff9027c88302e9d610 100644 (file)
@@ -2491,6 +2491,11 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript,
                 a reference to the value.  */
              gfc_conv_expr (&se, expr);
            }
+
+         /* Ensure that a pointer to the string is stored.  */
+         if (expr->ts.type == BT_CHARACTER)
+           gfc_conv_string_parameter (&se);
+
          gfc_add_block_to_block (&outer_loop->pre, &se.pre);
          gfc_add_block_to_block (&outer_loop->post, &se.post);
          if (gfc_is_class_scalar_expr (expr))
index 1e156ff9c021f94f99cfdab637e7f6f233fe398d..12da0a0025e4d80fd21f721facf9310be0df435b 100644 (file)
@@ -6350,7 +6350,13 @@ gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
       /* Returns a reference to the scalar evaluated outside the loop
         for this case.  */
       gfc_conv_expr (se, expr);
-      se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
+
+      if (expr->ts.type == BT_CHARACTER
+         && expr->expr_type != EXPR_FUNCTION)
+       gfc_conv_string_parameter (se);
+      else
+       se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
+
       return;
     }
 
index b4c6fdd5c13bbf21b22f3fcdb767f3b34efc8d44..8af85b50c0e3e77c9f048ca9bbb2a8957e31a5dd 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-01  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/59906
+       * gfortran.dg/elemental_subroutine_9.f90 : New test
+
 2014-02-01  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * gcc.dg/tree-ssa/ssa-dom-thread-4.c: Adjust expected MIPS output.
diff --git a/gcc/testsuite/gfortran.dg/elemental_subroutine_9.f90 b/gcc/testsuite/gfortran.dg/elemental_subroutine_9.f90
new file mode 100644 (file)
index 0000000..8f574bf
--- /dev/null
@@ -0,0 +1,39 @@
+! { dg-do run }
+!
+! PR fortran/59906
+!
+! Contributed by H Anlauf  <anlauf@gmx.de>
+!
+! Failed generate character scalar for scalarized loop for elemantal call.
+!
+program x
+  implicit none
+  call y('bbb')
+contains
+
+  subroutine y(str)
+    character(len=*), intent(in) :: str
+    character(len=len_trim(str)) :: str_aux
+    character(len=3) :: str3 = 'abc'
+
+    str_aux = str
+
+    ! Compiled but did not give correct result
+    if (any (str_cmp((/'aaa','bbb'/), str) .neqv. [.FALSE.,.TRUE.])) call abort
+
+    ! Did not compile
+    if (any (str_cmp((/'bbb', 'aaa'/), str_aux) .neqv. [.TRUE.,.FALSE.])) call abort
+
+    ! Verify patch
+    if (any (str_cmp((/'bbb', 'aaa'/), str3) .neqv. [.FALSE.,.FALSE.])) call abort
+    if (any (str_cmp((/'bbb', 'aaa'/), 'aaa') .neqv. [.FALSE.,.TRUE.])) call abort
+
+  end subroutine y
+
+  elemental logical function str_cmp(str1, str2)
+    character(len=*), intent(in) :: str1
+    character(len=*), intent(in) :: str2
+    str_cmp = (str1 == str2)
+  end function str_cmp
+
+end program x