[Bug fortran/54932] Invalid loop code generated by Fortran FE for loops with bounds in HIGH(type)

burnus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Oct 17 10:42:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54932

--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-10-17 10:41:49 UTC ---
(In reply to comment #3)
> "7.1.5.2.4 Evaluation of numeric intrinsic operations"
> "The execution of any numeric operation whose result is not defined by the
> arithmetic used by the processor is prohibited."

(Note that "processor" in the standard refers to the combination of compiler,
libraries, operating system and hardware/CPU.)


> Hm, the arithmetic used by the processor specifies that HUGE(i) + 1 is -INF.

I think you mean -HUGE(i)-1. (That's at least the hardware part of the
"processor".)


> Does that mean the value after the loop should be the wrapped value?

Seems so - at least that is what one gets after "huge(i)+1" - at least if one
regards it as defined by the processor.


> From the sentence above I do not read that the standard requires a
> specific behavior, just that it prohibits undefined behavior.

The wording is a bit vague as it is a catch all phrase.

Well, to a certain extend it is undefined behaviour: It depends on the
"processor" whether it is valid or not.


> Which means this is similar to C implementation specific behavior?

I don't know the exact wording for this case in the C standard, but I assume
so.


> Does the standard require us to be consistent there then?  Currently GCC
> assumes signed overflow invokes undefined behavior.

I think it doesn't require (but permits) this consistency. (As the semantic
differs between C and Fortran it can't require it.) The standard only specifies
interoperability with the "companion processor" for variables and function
calls.


Thus, the question is mostly what can a user (reasonably) expect. Users
seemingly like to use HUGE in loop bounds (cf. also PR 40205). For real-world
code I could imagine some use like
  do i = 1, huge(i)
    ...
    if (cond) exit
  end do
But I am not sure whether any real-world code contains such algorithms. At
least the two codes I use don't.



More information about the Gcc-bugs mailing list