diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/gfortran.dg/elemental_optional_args_3.f90 | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gfortran.dg/elemental_optional_args_3.f90')
-rw-r--r-- | gcc-4.9/gcc/testsuite/gfortran.dg/elemental_optional_args_3.f90 | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gfortran.dg/elemental_optional_args_3.f90 b/gcc-4.9/gcc/testsuite/gfortran.dg/elemental_optional_args_3.f90 new file mode 100644 index 000000000..c1098b34e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gfortran.dg/elemental_optional_args_3.f90 @@ -0,0 +1,85 @@ +! { dg-do run } +! +! PR fortran/50981 +! The program used to dereference a NULL pointer when trying to access +! a pointer dummy argument to be passed to an elemental subprocedure. +! +! Original testcase from Andriy Kostyuk <kostyuk@fias.uni-frankfurt.de> + +PROGRAM test + IMPLICIT NONE + REAL(KIND=8), DIMENSION(2) :: aa, rr + INTEGER, TARGET :: c + INTEGER, POINTER :: b + + aa(1)=10. + aa(2)=11. + + b=>c + b=1 + + ! WRITE(*,*) 'Both f1 and ff work if the optional parameter is present:' + + rr=f1(aa,b) + ! WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) + IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT + + rr=0 + rr=ff(aa,b) + ! WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) + IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT + + + b => NULL() + ! WRITE(*,*) 'But only f1 works if the optional parameter is absent:' + + rr=0 + rr=f1(aa, b) + ! WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) + IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT + + rr = 0 + rr=ff(aa, b) + ! WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) + IF (ANY(rr /= (/ 110, 132 /))) CALL ABORT + + +CONTAINS + + FUNCTION ff(a,b) + IMPLICIT NONE + REAL(KIND=8), INTENT(IN) :: a(:) + REAL(KIND=8), DIMENSION(SIZE(a)) :: ff + INTEGER, INTENT(IN), POINTER :: b + REAL(KIND=8), DIMENSION(2, SIZE(a)) :: ac + ac(1,:)=a + ac(2,:)=a**2 + ff=SUM(gg(ac,b), dim=1) + END FUNCTION ff + + FUNCTION f1(a,b) + IMPLICIT NONE + REAL(KIND=8), INTENT(IN) :: a(:) + REAL(KIND=8), DIMENSION(SIZE(a)) :: f1 + INTEGER, INTENT(IN), POINTER :: b + REAL(KIND=8), DIMENSION(2, SIZE(a)) :: ac + ac(1,:)=a + ac(2,:)=a**2 + f1=gg(ac(1,:),b)+gg(ac(2,:),b) ! This is the same as in ff, but without using the elemental feature of gg + END FUNCTION f1 + + ELEMENTAL REAL(KIND=8) FUNCTION gg(a,b) + IMPLICIT NONE + REAL(KIND=8), INTENT(IN) :: a + INTEGER, INTENT(IN), OPTIONAL :: b + INTEGER ::b1 + IF(PRESENT(b)) THEN + b1=b + ELSE + b1=1 + ENDIF + gg=a**b1 + END FUNCTION gg + + +END PROGRAM test |