1! { dg-do run }
2!
3! PR fortran/50981
4! The program used to dereference a NULL pointer when trying to access
5! an allocatable dummy argument to be passed to an elemental subprocedure.
6!
7! Original testcase from Andriy Kostyuk <kostyuk@fias.uni-frankfurt.de>
8
9PROGRAM test
10  IMPLICIT NONE
11  REAL(KIND=8), DIMENSION(2) :: aa, rr
12  INTEGER, ALLOCATABLE :: b
13
14  aa(1)=10.
15  aa(2)=11.
16
17  ALLOCATE(b)
18  b=1
19
20  ! WRITE(*,*) 'Both f1 and ff work if the optional parameter is present:'
21
22  rr=f1(aa,b)
23  ! WRITE(*,*) ' rr(1)=', rr(1), '  rr(2)=', rr(2)
24  IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT
25
26  rr=0
27  rr=ff(aa,b)
28  ! WRITE(*,*) ' rr(1)=', rr(1), '  rr(2)=', rr(2)
29  IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT
30
31
32  DEALLOCATE(b)
33  ! WRITE(*,*) 'But only f1 works if the optional parameter is absent:'
34
35  rr=0
36  rr=f1(aa, b)
37  ! WRITE(*,*) ' rr(1)=', rr(1), '  rr(2)=', rr(2)
38  IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT
39
40  rr = 0
41  rr=ff(aa, b)
42  ! WRITE(*,*) ' rr(1)=', rr(1), '  rr(2)=', rr(2)
43  IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT
44
45
46CONTAINS
47
48    FUNCTION ff(a,b)
49      IMPLICIT NONE
50      REAL(KIND=8), INTENT(IN) :: a(:)
51      REAL(KIND=8), DIMENSION(SIZE(a)) :: ff
52      INTEGER, INTENT(IN), ALLOCATABLE :: b
53      REAL(KIND=8), DIMENSION(2, SIZE(a)) :: ac
54      ac(1,:)=a
55      ac(2,:)=a**2
56      ff=SUM(gg(ac,b), dim=1)
57    END FUNCTION ff
58
59    FUNCTION f1(a,b)
60      IMPLICIT NONE
61      REAL(KIND=8), INTENT(IN) :: a(:)
62      REAL(KIND=8), DIMENSION(SIZE(a)) :: f1
63      INTEGER, INTENT(IN), ALLOCATABLE :: b
64      REAL(KIND=8), DIMENSION(2, SIZE(a)) :: ac
65      ac(1,:)=a
66      ac(2,:)=a**2
67      f1=gg(ac(1,:),b)+gg(ac(2,:),b) ! This is the same as in ff, but without using the elemental feature of gg
68    END FUNCTION f1
69
70    ELEMENTAL REAL(KIND=8) FUNCTION gg(a,b)
71      IMPLICIT NONE
72      REAL(KIND=8), INTENT(IN) :: a
73      INTEGER, INTENT(IN), OPTIONAL :: b
74      INTEGER ::b1
75      IF(PRESENT(b)) THEN
76        b1=b
77      ELSE
78        b1=1
79      ENDIF
80      gg=a**b1
81    END FUNCTION gg
82
83
84END PROGRAM test
85