Patchwork [Fortran] Coarray - fix assumed-shape cobounds

login
register
mail settings
Submitter Tobias Burnus
Date May 30, 2011, 3:26 p.m.
Message ID <4DE3B735.3070904@net-b.de>
Download mbox | patch
Permalink /patch/97930/
State New
Headers show

Comments

Tobias Burnus - May 30, 2011, 3:26 p.m.
Simple patch, which requires the previous patch at 
http://gcc.gnu.org/ml/fortran/2011-05/msg00231.html

OK for the trunk?

Tobias
Tobias Burnus - May 31, 2011, 6:42 p.m.
Tobias Burnus wrote:
> Simple patch, which requires the previous patch at 
> http://gcc.gnu.org/ml/fortran/2011-05/msg00231.html
>
> OK for the trunk?

Approved by Daniel Kraft on IRC, committed as Rev. 174504.

Thanks for the reviews!

Tobias

Patch

2011-05-30  Tobias Burnus  <burnus@net-b.de>

        PR fortran/18918
	* trans-array.c (gfc_trans_dummy_array_bias): Handle
	cobounds of assumed-shape arrays.

2011-05-30  Tobias Burnus  <burnus@net-b.de>

        PR fortran/18918
	* gfortran.dg/coarray/dummy_1.f90: New.

diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index d83a7a9..c7aeadb 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -5213,6 +5232,8 @@  gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc,
 	}
     }
 
+  gfc_trans_array_cobounds (type, &init, sym);
+
   /* Set the offset.  */
   if (TREE_CODE (GFC_TYPE_ARRAY_OFFSET (type)) == VAR_DECL)
     gfc_add_modify (&init, GFC_TYPE_ARRAY_OFFSET (type), offset);
--- /dev/null	2011-05-29 07:20:52.091892040 +0200
+++ gcc/gcc/testsuite/gfortran.dg/coarray/dummy_1.f90	2011-05-30 17:21:53.000000000 +0200
@@ -0,0 +1,70 @@ 
+! { dg-do run }
+!
+! PR fortran/18918
+!
+! Check whether assumed-shape's cobounds are properly handled
+!
+    implicit none
+    integer :: B(1)[*]
+    integer :: C(8:11)[-3:10,43:*]
+    integer, allocatable :: D(:)[:,:]
+
+    allocate (D(20)[2:3,5:*])
+
+    call sub (B,5)
+    call sub (C,3)
+    call sub (D,3)
+
+    call sub2 (B, -3)
+    call sub2 (C, 44)
+    call sub2 (D, 44)
+
+    call sub3 (B)
+    call sub3 (C)
+    call sub3 (D)
+
+    call sub4 (B)
+    call sub4 (C)
+    call sub4 (D)
+
+    call sub5 (D)
+  contains
+
+  subroutine sub(A,n)
+    integer :: n
+    integer :: A(n:)[n:2*n,3*n:*]
+    if (lbound(A,dim=1) /= n) call abort ()
+    if (any (lcobound(A) /= [n, 3*n])) call abort ()
+    if (ucobound(A, dim=1) /= 2*n) call abort()
+  end subroutine sub
+
+  subroutine sub2(A,n)
+    integer :: n
+    integer :: A(:)[-n:*]
+    if (lbound(A,dim=1) /= 1) call abort ()
+    if (lcobound(A, dim=1) /= -n) call abort ()
+  end subroutine sub2
+
+  subroutine sub3(A)
+    integer :: A(:)[0,*]
+    if (lbound(A,dim=1) /= 1) call abort ()
+    if (lcobound(A, dim=1) /= 1) call abort ()
+    if (ucobound(A, dim=1) /= 0) call abort ()
+    if (lcobound(A, dim=2) /= 1) call abort ()
+  end subroutine sub3
+
+  subroutine sub4(A)
+    integer :: A(:)[*]
+    if (lbound(A,dim=1) /= 1) call abort ()
+    if (lcobound(A, dim=1) /= 1) call abort ()
+  end subroutine sub4
+
+  subroutine sub5(A)
+    integer, allocatable :: A(:)[:,:]
+
+    if (lbound(A,dim=1) /= 1) call abort ()
+    if (lcobound(A, dim=1) /= 2) call abort ()
+    if (ucobound(A, dim=1) /= 3) call abort ()
+    if (lcobound(A, dim=2) /= 5) call abort ()
+  end subroutine sub5
+  end