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