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