Commit da78a067 by Paul Thomas

re PR fortran/59906 (error: size of variable '<anonymous>' is too large)

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
parent bca420ed
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> 2014-01-28 Paul Thomas <pault@gcc.gnu.org>
PR fortran/59414 PR fortran/59414
......
...@@ -2491,6 +2491,11 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript, ...@@ -2491,6 +2491,11 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript,
a reference to the value. */ a reference to the value. */
gfc_conv_expr (&se, expr); 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->pre, &se.pre);
gfc_add_block_to_block (&outer_loop->post, &se.post); gfc_add_block_to_block (&outer_loop->post, &se.post);
if (gfc_is_class_scalar_expr (expr)) if (gfc_is_class_scalar_expr (expr))
......
...@@ -6350,7 +6350,13 @@ gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr) ...@@ -6350,7 +6350,13 @@ gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
/* Returns a reference to the scalar evaluated outside the loop /* Returns a reference to the scalar evaluated outside the loop
for this case. */ for this case. */
gfc_conv_expr (se, expr); 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; return;
} }
......
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> 2014-02-01 Richard Sandiford <rdsandiford@googlemail.com>
* gcc.dg/tree-ssa/ssa-dom-thread-4.c: Adjust expected MIPS output. * gcc.dg/tree-ssa/ssa-dom-thread-4.c: Adjust expected MIPS output.
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment