aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2008-01-11 18:25:29 +0000
committerPaul Thomas <pault@gcc.gnu.org>2008-01-11 18:25:29 +0000
commitd9183bb7443a3cb85cd170a2527d5b22848907bb (patch)
tree6b3851460e79b62e49a41d6c930d14975ef4d795 /gcc
parentc1e3e2d94487bf594494cbb8cd32aa332124cd33 (diff)
downloadgcc-d9183bb7443a3cb85cd170a2527d5b22848907bb.zip
gcc-d9183bb7443a3cb85cd170a2527d5b22848907bb.tar.gz
gcc-d9183bb7443a3cb85cd170a2527d5b22848907bb.tar.bz2
re PR fortran/34537 (ICE or wrong code for TRANSFER of constant string to character)
2008-01-11 Paul Thomas <pault@gcc.gnu.org> PR fortran/34537 * simplify.c (gfc_simplify_transfer): Return NULL if the size of the element is unavailable and only assign character length to the result, if 'mold' is constant. 2008-01-11 Paul Thomas <pault@gcc.gnu.org> PR fortran/34537 * gfortran.dg/transfer_simplify_8.f90: New test. From-SVN: r131470
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/simplify.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/transfer_simplify_8.f9021
4 files changed, 40 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6a42531..645cbdb 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2008-01-11 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/34537
+ * simplify.c (gfc_simplify_transfer): Return NULL if the size
+ of the element is unavailable and only assign character length
+ to the result, if 'mold' is constant.
+
2008-01-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34396
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 1641586..85d74a5 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -4121,11 +4121,17 @@ gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
/* Set result character length, if needed. Note that this needs to be
set even for array expressions, in order to pass this information into
gfc_target_interpret_expr. */
- if (result->ts.type == BT_CHARACTER)
+ if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
result->value.character.length = mold_element->value.character.length;
/* Set the number of elements in the result, and determine its size. */
result_elt_size = gfc_target_expr_size (mold_element);
+ if (result_elt_size == 0)
+ {
+ gfc_free_expr (result);
+ return NULL;
+ }
+
if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
{
int result_length;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ae478ae..00fb000 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-11 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/34537
+ * gfortran.dg/transfer_simplify_8.f90: New test.
+
2008-01-11 Andreas Krebbel <krebbel1@de.ibm.com>
* g++.dg/torture/pr34641.C: Add dg-require-visibility. Define
diff --git a/gcc/testsuite/gfortran.dg/transfer_simplify_8.f90 b/gcc/testsuite/gfortran.dg/transfer_simplify_8.f90
new file mode 100644
index 0000000..75b0846
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/transfer_simplify_8.f90
@@ -0,0 +1,21 @@
+! { dg-do run }
+! { dg-options "-O0" }
+! PR fortran/34537
+! simplify_transfer used to ICE on divide by zero for cases like this,
+! where the mold expression is a non-constant character expression.
+!
+! Testcase contributed by Tobias Burnus <burnus@gcc.gnu.org >
+!
+ character, pointer :: ptr(:)
+ character(8) :: a
+ allocate(ptr(9))
+ ptr = transfer('Sample#0'//achar(0),ptr) ! Causes ICE
+ if (any (ptr .ne. ['S','a','m','p','l','e','#','0',achar(0)])) call abort
+ call test(a)
+ if (a .ne. 'Sample#2') call abort
+contains
+ subroutine test(a)
+ character(len=*) :: a
+ a = transfer('Sample#2',a)
+ end subroutine test
+end