aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/elemental_dependency_5.f90
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gfortran.dg/elemental_dependency_5.f90')
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_dependency_5.f9061
1 files changed, 61 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/elemental_dependency_5.f90 b/gcc/testsuite/gfortran.dg/elemental_dependency_5.f90
new file mode 100644
index 00000000000..42e92692d02
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/elemental_dependency_5.f90
@@ -0,0 +1,61 @@
+! { dg-do run }
+!
+! Tests the fix for PR64952.
+!
+! Original report by Nick Maclaren <nmm1@cam.ac.uk> on clf
+! https://groups.google.com/forum/#!topic/comp.lang.fortran/TvVY5j3GPmg
+! See elemental_dependency_4.f90
+!
+! This test contributed by Mikael Morin <mikael.morin@sfr.fr>
+!
+MODULE M
+ INTEGER, PRIVATE :: i
+
+ TYPE, ABSTRACT :: t
+ REAL :: f
+ CONTAINS
+ PROCEDURE(Fred_ifc), DEFERRED, PASS :: tbp
+ END TYPE t
+ TYPE, EXTENDS(t) :: t2
+ CONTAINS
+ PROCEDURE :: tbp => Fred
+ END TYPE t2
+
+ TYPE(t2) :: array(5) = (/ (t2(i+0.0), i = 1,5) /)
+
+ INTERFACE
+ ELEMENTAL FUNCTION Fred_ifc (x, n)
+ IMPORT
+ REAL :: Fred
+ CLASS(T), INTENT(IN) :: x
+ INTEGER, INTENT(IN) :: n
+ END FUNCTION Fred_ifc
+ END INTERFACE
+
+CONTAINS
+ ELEMENTAL FUNCTION Fred (x, n)
+ REAL :: Fred
+ CLASS(T2), INTENT(IN) :: x
+ INTEGER, INTENT(IN) :: n
+ Fred = x%f+SUM(array(:n-1)%f)+SUM(array(n+1:)%f)
+ END FUNCTION Fred
+END MODULE M
+
+PROGRAM Main
+ USE M
+ INTEGER :: i, index(5) = (/ (i, i = 1,5) /)
+
+ array%f = array%tbp(index)
+ if (any (array%f .ne. array(1)%f)) call abort
+
+ array%f = index
+ call Jack(array)
+ CONTAINS
+ SUBROUTINE Jack(dummy)
+ CLASS(t) :: dummy(:)
+ dummy%f = dummy%tbp(index)
+ !print *, dummy%f
+ if (any (dummy%f .ne. 15.0)) call abort
+ END SUBROUTINE
+END PROGRAM Main
+