re PR fortran/49268 (Invalid code generated for assumed-size Cray pointee)
authorAsher Langton <langton2@llnl.gov>
Thu, 2 Jun 2011 21:41:12 +0000 (21:41 +0000)
committerAsher Langton <langton@gcc.gnu.org>
Thu, 2 Jun 2011 21:41:12 +0000 (21:41 +0000)
    * trans-decl.c (gfc_trans_deferred_vars): Treat assumed-size Cray
        pointees as AS_EXPLICIT.

    * gfortran.dg/PR49268.f90: New test.

From-SVN: r174584

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/PR49268.f90 [new file with mode: 0644]

index fec047ed63b2389227e93e81595404ba5791bae6..532a30b1ab31f8a7ef6d53056314b4a20b54c720 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-02  Asher Langton  <langton2@llnl.gov>
+
+       PR fortran/49268
+       * trans-decl.c (gfc_trans_deferred_vars): Treat assumed-size Cray
+       pointees as AS_EXPLICIT.
+
 2011-06-02  Asher Langton  <langton2@llnl.gov>
 
        PR fortran/37039
index 27eca79c80459447c9f1e9cbe934c39739187430..a22591535639984d2a38f15975a5ac76ab1e5acb 100644 (file)
@@ -3465,7 +3465,11 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
 
       if (sym->attr.dimension || sym->attr.codimension)
        {
-         switch (sym->as->type)
+          /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT.  */
+          array_type tmp = sym->as->type;
+          if (tmp == AS_ASSUMED_SIZE && sym->as->cp_was_assumed)
+            tmp = AS_EXPLICIT;
+          switch (tmp)
            {
            case AS_EXPLICIT:
              if (sym->attr.dummy || sym->attr.result)
index 2a45ec1c57ad929872ab52c98d61a460037d4432..135087c8a4583900ebc4403a0e7f0d674c9519ff 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-02  Asher Langton  <langton2@llnl.gov>
+
+       PR fortran/49268
+       * gfortran.dg/PR49268.f90: New test.
+
 2011-06-02  Asher Langton  <langton2@llnl.gov>
 
        PR fortran/37039
diff --git a/gcc/testsuite/gfortran.dg/PR49268.f90 b/gcc/testsuite/gfortran.dg/PR49268.f90
new file mode 100644 (file)
index 0000000..5b274cf
--- /dev/null
@@ -0,0 +1,51 @@
+! { dg-do run }
+! { dg-options "-fcray-pointer" }
+
+! Test the fix for a runtime error 
+! Contributed by Mike Kumbera <kumbera1@llnl.gov>
+
+        program bob
+        implicit none
+        integer*8 ipfoo
+        integer n,m,i,j
+        real*8 foo
+        
+        common /ipdata/ ipfoo
+        common /ipsize/ n,m
+        POINTER ( ipfoo, foo(3,7) )
+
+        n=3
+        m=7
+
+        ipfoo=malloc(8*n*m)
+        do i=1,n
+            do j=1,m
+                foo(i,j)=1.d0
+            end do
+        end do
+        call use_foo()
+        end  program bob
+
+
+        subroutine use_foo()
+        implicit none
+        integer n,m,i,j
+        integer*8 ipfoo
+        common /ipdata/ ipfoo
+        common /ipsize/ n,m
+        real*8 foo,boo
+
+        !fails if * is the last dimension
+        POINTER ( ipfoo, foo(n,*) )
+
+        !works if the last dimension is specified
+        !POINTER ( ipfoo, foo(n,m) )
+        boo=0.d0
+        do i=1,n
+            do j=1,m
+               boo=foo(i,j)+1.0
+               if (abs (boo - 2.0) .gt. 1e-6) call abort
+            end do
+        end do
+
+        end subroutine use_foo