summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/ret_array_1.f90
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gfortran.dg/ret_array_1.f90
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gfortran.dg/ret_array_1.f90')
-rw-r--r--gcc/testsuite/gfortran.dg/ret_array_1.f9063
1 files changed, 63 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/ret_array_1.f90 b/gcc/testsuite/gfortran.dg/ret_array_1.f90
new file mode 100644
index 000000000..45e5a07c1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/ret_array_1.f90
@@ -0,0 +1,63 @@
+! { dg-do run }
+! Test functions returning arrays of indeterminate size.
+program ret_array_1
+ integer, dimension(:, :), allocatable :: a
+ integer, dimension(2) :: b
+
+ allocate (a(2, 3))
+ a = reshape ((/1, 2, 3, 4, 5, 6/), (/2, 3/))
+
+ ! Using the return value as an actual argument
+ b = 0;
+ b = sum (transpose (a), 1);
+ if (any (b .ne. (/9, 12/))) call abort ()
+
+ ! Using the return value in an expression
+ b = 0;
+ b = sum (transpose (a) + 1, 1);
+ if (any (b .ne. (/12, 15/))) call abort ()
+
+ ! Same again testing a user function
+! TODO: enable these once this is implemented
+! b = 0;
+! b = sum (my_transpose (a), 1);
+! if (any (b .ne. (/9, 12/))) call abort ()
+!
+! ! Using the return value in an expression
+! b = 0;
+! b = sum (my_transpose (a) + 1, 1);
+! if (any (b .ne. (/12, 15/))) call abort ()
+contains
+subroutine test(x, n)
+ integer, dimension (:, :) :: x
+ integer n
+
+ if (any (shape (x) .ne. (/3, 2/))) call abort
+ if (any (x .ne. (n + reshape((/1, 4, 2, 5, 3, 6/), (/3, 2/))))) call abort
+end subroutine
+
+function my_transpose (x) result (r)
+ interface
+ pure function obfuscate (i)
+ integer obfuscate
+ integer, intent(in) :: i
+ end function
+ end interface
+ integer, dimension (:, :) :: x
+ integer, dimension (obfuscate(ubound(x, 2)), &
+ obfuscate(ubound(x, 1))) :: r
+ integer i
+
+ do i = 1, ubound(x, 1)
+ r(:, i) = x(i, :)
+ end do
+end function
+end program
+
+pure function obfuscate (i)
+ integer obfuscate
+ integer, intent(in) :: i
+
+ obfuscate = i
+end function
+