------- Additional Comments From tobi at gcc dot gnu dot org 2005-03-19 00:54 ------- Slightly reduced testcase, segfaults at -O2, runs with lower optimization. Removing any single statement leads to either illegal floating pointn numbers or makes the segfault disappear:
character(len=8) argv real*8, parameter :: tstep = 0.01d0 real*8 :: e type body real*8 x, y,z,vx,vy,vz, mass end type body type(body), parameter :: jupiter = body(1d0, 1d0, 1d0, 1d0, 1d0, 1d0, 1d0 ) type(body), parameter :: sun = body(0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0,1d0) type(body), dimension(2) :: bodies bodies = (/ sun, jupiter/) argv = "1" read (argv,*) num call offsetMomentum(1,bodies) do i=1,num call advance(tstep, bodies) end do e = 0. print *, e contains subroutine offsetMomentum(k, bodies) integer, intent(in) :: k type(body), dimension(:), intent(inout) :: bodies real*8 :: px, py, pz do i=1,size(bodies) px = bodies(i)%vx * bodies(i)%mass; end do bodies(k)%vx = -px end subroutine offsetMomentum subroutine advance(tstep, bodies) real*8, intent(in) :: tstep type(body), dimension(:), intent(inout) :: bodies real*8 dx, dy, dz, distance, mag integer i, j i = 1; j = 2; mag = 1. dx = bodies(i)%x - bodies(j)%x bodies(i)%vx = bodies(i)%vx - dx * bodies(j)%mass * mag bodies(j)%vx = bodies(j)%vx + dx * bodies(i)%mass * mag bodies(j)%vy = bodies(j)%vy + dy * bodies(i)%mass * mag bodies(j)%vz = bodies(j)%vz + dz * bodies(i)%mass * mag do i=1,size(bodies) bodies(i)%x = bodies(i)%x + tstep * bodies(i)%vx bodies(i)%y = bodies(i)%y + tstep * bodies(i)%vy bodies(i)%z = bodies(i)%z + tstep * bodies(i)%vz end do end subroutine advance real*8 function energy(bodies) type(body), dimension(:), intent(in) :: bodies real*8 dx, dy, dz, distance integer i, j energy = 0.0d0 end function energy end -- What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed| |1 Last reconfirmed|0000-00-00 00:00:00 |2005-03-19 00:54:17 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20538