>>555
tmpをALLOCATEしてないからかな?

ALLOCATE(tmp(SIZE([arr .ne. 0])))

これを入れておくと動く。
配列を返すものを、未割り当ての割りつけ配列に入れたときの挙動が、
F90の範囲ではプログラム側に問題があって悪いとおもうが、
新しい規格ではかなり自動で調整してくれるようになったので、
これがBugなのかどうか文法書を読み直さないと分からんw

[ ] はF2003で、f90なら(/ /) に対応。