summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/ret_array_1.f90
diff options
context:
space:
mode:
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
+