diff options
author | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-01-11 18:25:29 +0000 |
---|---|---|
committer | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-01-11 18:25:29 +0000 |
commit | 0a0a67502c9bb43167cee294a1d1b304de998359 (patch) | |
tree | 6b3851460e79b62e49a41d6c930d14975ef4d795 | |
parent | 1ae2ffa70e028b1070bf21c524111aca8e0d553a (diff) | |
download | gcc-0a0a67502c9bb43167cee294a1d1b304de998359.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131470 138bc75d-0d04-0410-961f-82ee72b054a4
-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 6a425317c17..645cbdb0481 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 1641586457e..85d74a5e13a 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 ae478aef26c..00fb000e2c8 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 00000000000..75b084670ac --- /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 |