aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/dec_structure_7.f90
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gfortran.dg/dec_structure_7.f90')
-rw-r--r--gcc/testsuite/gfortran.dg/dec_structure_7.f9075
1 files changed, 75 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_7.f90 b/gcc/testsuite/gfortran.dg/dec_structure_7.f90
new file mode 100644
index 00000000000..baba1ef2b5f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_7.f90
@@ -0,0 +1,75 @@
+! { dg-do run }
+! { dg-options "-fdec-structure" }
+!
+! Test passing STRUCTUREs through functions and subroutines.
+!
+
+subroutine aborts (s)
+ character(*), intent(in) :: s
+ print *, s
+ call abort()
+end subroutine
+
+module dec_structure_7m
+ structure /s1/
+ integer i1
+ logical l1
+ real r1
+ character c1
+ end structure
+
+ structure /s2/
+ integer i
+ record /s1/ r1
+ endstructure
+
+contains
+ ! Pass structure through subroutine
+ subroutine sub (rec1, i)
+ implicit none
+ integer, intent(in) :: i
+ record /s1/ rec1
+ rec1.i1 = i
+ end subroutine
+
+ ! Pass structure through function
+ function func (rec2, r)
+ implicit none
+ real, intent(in) :: r
+ record /s2/ rec2
+ real func
+ rec2.r1.r1 = r
+ func = rec2.r1.r1
+ return
+ end function
+end module
+
+program dec_structure_7
+ use dec_structure_7m
+
+ implicit none
+ record /s1/ r1
+ record /s2/ r2
+ real junk
+
+ ! Passing through functions and subroutines
+ r1.i1 = 0
+ call sub (r1, 10)
+
+ r2.r1.r1 = 0.0
+ junk = func (r2, -20.14)
+
+ if (r1.i1 .ne. 10) then
+ call aborts("sub(r1, 10)")
+ endif
+
+ if (r2.r1.r1 .ne. -20.14) then
+ call aborts("func(r2, -20.14)")
+ endif
+
+ if (junk .ne. -20.14) then
+ print *, junk
+ call aborts("junk = func()")
+ endif
+
+end program