2018-09-30 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / testsuite / gfortran.dg / impure_1.f08
blob38ecedefb4291fbbd8e6ac94d19ac618661f852a
1 ! { dg-do run }
2 ! { dg-options "-std=f2008 " }
4 ! PR fortran/45197
5 ! Check that IMPURE and IMPURE ELEMENTAL in particular works.
7 ! Contributed by Daniel Kraft, d@domob.eu.
9 MODULE m
10   IMPLICIT NONE
12   INTEGER, PARAMETER :: n = 5
14   INTEGER :: i
15   INTEGER :: arr(n)
17 CONTAINS
19   ! This ought to work (without any effect).
20   IMPURE SUBROUTINE foobar ()
21   END SUBROUTINE foobar
23   IMPURE ELEMENTAL SUBROUTINE impureSub (a)
24     INTEGER, INTENT(IN) :: a
26     arr(i) = a
27     i = i + 1
29     PRINT *, a
30   END SUBROUTINE impureSub
32 END MODULE m
34 PROGRAM main
35   USE :: m
36   IMPLICIT NONE
38   INTEGER :: a(n), b(n), s
40   a = (/ (i, i = 1, n) /)
42   ! Traverse in forward order.
43   s = 0
44   b = accumulate (a, s)
45   IF (ANY (b /= (/ 1, 3, 6, 10, 15 /))) STOP 1
47   ! And now backward.
48   s = 0
49   b = accumulate (a(n:1:-1), s)
50   IF (ANY (b /= (/ 5, 9, 12, 14, 15 /))) STOP 2
52   ! Use subroutine.
53   i = 1
54   arr = 0
55   CALL impureSub (a)
56   IF (ANY (arr /= a)) STOP 3
58 CONTAINS
60   IMPURE ELEMENTAL FUNCTION accumulate (a, s)
61     INTEGER, INTENT(IN) :: a
62     INTEGER, INTENT(INOUT) :: s
63     INTEGER :: accumulate
64     
65     s = s + a
66     accumulate = s
67   END FUNCTION accumulate
69 END PROGRAM main