aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2013-01-30 08:47:14 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2013-01-30 08:47:14 +0100
commite18547a18cb5116bc940976cba250e0de045640b (patch)
tree9221879e32048487de0fedefe5de36057420f0d6 /gcc
parent777133fefb9704c957884216e44bf7ba25ca2fae (diff)
downloadgcc-e18547a18cb5116bc940976cba250e0de045640b.zip
gcc-e18547a18cb5116bc940976cba250e0de045640b.tar.gz
gcc-e18547a18cb5116bc940976cba250e0de045640b.tar.bz2
re PR fortran/56138 (Deferred-length character RESULT: ICE in gfc_add_modify_loc)
2012-01-30 Tobias Burnus <burnus@net-b.de> PR fortran/56138 * trans-decl.c (gfc_trans_deferred_vars): Fix deferred-length results for functions without extra result variable. 2012-01-30 Tobias Burnus <burnus@net-b.de> PR fortran/56138 * gfortran.dg/allocatable_function_6.f90: New. From-SVN: r195570
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-decl.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/allocatable_function_6.f9022
4 files changed, 34 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6a42ba4..bef16a5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2012-01-30 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/56138
+ * trans-decl.c (gfc_trans_deferred_vars): Fix deferred-length
+ results for functions without extra result variable.
+
2013-01-29 Janus Weil <janus@gcc.gnu.org>
Mikael Morin <mikael@gcc.gnu.org>
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 1d0919d..7732440 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -3775,7 +3775,7 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
null_pointer_node));
}
- if ((sym->attr.dummy ||sym->attr.result)
+ if ((sym->attr.dummy || sym->attr.result || sym->result == sym)
&& sym->ts.type == BT_CHARACTER
&& sym->ts.deferred)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 761d601..d4b666f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-01-30 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/56138
+ * gfortran.dg/allocatable_function_6.f90: New.
+
2013-01-29 Janus Weil <janus@gcc.gnu.org>
Mikael Morin <mikael@gcc.gnu.org>
diff --git a/gcc/testsuite/gfortran.dg/allocatable_function_6.f90 b/gcc/testsuite/gfortran.dg/allocatable_function_6.f90
new file mode 100644
index 0000000..3af68cc
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/allocatable_function_6.f90
@@ -0,0 +1,22 @@
+! { dg-do run }
+!
+! PR fortran/56138
+!
+! Contributed by John Chludzinski, using the code of John Reid
+!
+implicit none
+CHARACTER(LEN=:),ALLOCATABLE :: str
+if (s_to_c("ABCdef") /= "ABCdef" .or. len(s_to_c("ABCdef")) /= 6) call abort()
+str = s_to_c("ABCdef")
+if (str /= "ABCdef" .or. len(str) /= 6) call abort()
+str(1:3) = s_to_c("123")
+if (str /= "123def" .or. len(str) /= 6) call abort()
+
+contains
+
+PURE FUNCTION s_to_c(string)
+ CHARACTER(LEN=*),INTENT(IN) :: string
+ CHARACTER(LEN=:),ALLOCATABLE :: s_to_c
+ s_to_c = string
+ENDFUNCTION s_to_c
+end