https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85599

Thomas Koenig <tkoenig at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|wrong-code                  |diagnostic
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-05-02
                 CC|                            |tkoenig at gcc dot gnu.org
     Ever confirmed|0                           |1
           Severity|normal                      |enhancement

--- Comment #2 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
(In reply to kargl from comment #1)

> 10.1.5.4.2 Evaluation of logical intrinsic operations
> 
>   Once the interpretation of a logical intrinsic operation is
>   established, the processor may evaluate any other expression
>   that is logically equivalent, provided that the integrity of
>   parentheses in any expression is not violated.
> 
>   Two expressions of type logical are logically equivalent
>   if their values are equal for all possible values of their
>   primaries.
> 
> With 'flag = .false.', gfortran can determine that 
> check()'s return value is irrelevant.  So, the
> the values of 'flag .and. check()' and 'flag' are
> logically equivalent.
> 
> Note, 'check() .and. flag' is logically equivalent
> to 'flag', but the standard does not require any order
> in the evaluation of op1 and op2 in a binary operation.
> 
> Also, note that this is my interpretation.  I could
> be wrong.

You're right, the code relying on side effects is undefined.

Confirming as enhancement request.

Would be nice to add a warning to catch this, though.

Reply via email to