diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2008-01-11 18:25:29 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2008-01-11 18:25:29 +0000 |
commit | d9183bb7443a3cb85cd170a2527d5b22848907bb (patch) | |
tree | 6b3851460e79b62e49a41d6c930d14975ef4d795 /gcc | |
parent | c1e3e2d94487bf594494cbb8cd32aa332124cd33 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/transfer_simplify_8.f90 | 21 |
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 |