https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85599
--- Comment #6 from janus at gcc dot gnu.org --- Another variant, this time with the (non-std) intrinsic function AND: program lazy logical :: flag flag = .false. flag = AND(check(), flag) flag = AND(flag, check()) contains logical function check() integer, save :: i = 1 print *, "check", i i = i + 1 check = .true. end function end This calls 'check' twice, as I would expect, and -fdump-tree-original shows that it is translated to this pseudo C code: flag = check () & flag; flag = check () & flag; While the original test case translates to: flag = check () && flag; flag = flag && check (); Changing the operand order (as done in the first case) does not matter here. Obviously the crucial difference is the use of & vs &&.