aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2011-01-23 23:26:27 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2011-01-23 23:26:27 +0100
commit25cbe58f23ff2fa8522d54c892c7f39af6cca373 (patch)
treea1c1fbba5c3dd098f55bed92f350b8f7952f4791
parentff3d9d08a811c2b1074010a72ede155231252eb0 (diff)
downloadgcc-25cbe58f23ff2fa8522d54c892c7f39af6cca373.zip
gcc-25cbe58f23ff2fa8522d54c892c7f39af6cca373.tar.gz
gcc-25cbe58f23ff2fa8522d54c892c7f39af6cca373.tar.bz2
re PR fortran/47421 (Wrong-code: Value of scalar ALLOCATABLE CHARACTER(len=n) dummy is mangled)
2011-01-23 Tobias Burnus <burnus@net-b.de> PR fortran/47421 * trans-decl.c (gfc_trans_deferred_vars): Do not nullify scalar allocatable dummy arguments. 2011-01-23 Tobias Burnus <burnus@net-b.de> PR fortran/47421 * gfortran.dg/allocatable_scalar_12.f90: New. From-SVN: r169145
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-decl.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/allocatable_scalar_12.f9030
4 files changed, 45 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e918ef5..489caca 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2011-01-23 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/47421
+ * trans-decl.c (gfc_trans_deferred_vars): Do not nullify
+ scalar allocatable dummy arguments.
+
2011-01-22 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/38536
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 254db76..5e3afbe 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -3304,9 +3304,10 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
if (sym_has_alloc_comp && !seen_trans_deferred_array)
gfc_trans_deferred_array (sym, block);
}
- else if (sym->attr.allocatable
- || (sym->ts.type == BT_CLASS
- && CLASS_DATA (sym)->attr.allocatable))
+ else if (!sym->attr.dummy
+ && (sym->attr.allocatable
+ || (sym->ts.type == BT_CLASS
+ && CLASS_DATA (sym)->attr.allocatable)))
{
if (!sym->attr.save)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c4cc1e0..71825be 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-23 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/47421
+ * gfortran.dg/allocatable_scalar_12.f90: New.
+
2011-01-23 Ira Rosen <irar@il.ibm.com>
* gcc.dg/vect/costmodel/spu/costmodel-vect-33.c: Expect
diff --git a/gcc/testsuite/gfortran.dg/allocatable_scalar_12.f90 b/gcc/testsuite/gfortran.dg/allocatable_scalar_12.f90
new file mode 100644
index 0000000..eade363
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/allocatable_scalar_12.f90
@@ -0,0 +1,30 @@
+! { dg-do run }
+!
+! PR fortran/47421
+!
+! Don't auto-deallocatable scalar character allocatables.
+!
+implicit none
+character(len=5), allocatable :: str
+allocate(str)
+str = '1bcde'
+if(str /= '1bcde') call abort()
+call sub(str,len(str))
+if(str /= '1bcde') call abort()
+call subOUT(str,len(str))
+if (len(str) /= 5) call abort()
+if(allocated(str)) call abort()
+contains
+ subroutine sub(x,n)
+ integer :: n
+ character(len=n), allocatable :: x
+ if(len(x) /= 5) call abort()
+ if(x /= '1bcde') call abort()
+ end subroutine sub
+ subroutine subOUT(x,n)
+ integer :: n
+ character(len=n), allocatable,intent(out) :: x
+ if(allocated(x)) call abort()
+ if(len(x) /= 5) call abort()
+ end subroutine subOUT
+end