2018-06-26 23:16 GMT+02:00 Jakub Jelinek <ja...@redhat.com>: > On Tue, Jun 26, 2018 at 11:12:40PM +0200, Thomas Koenig wrote: >> Hi Janus, >> >> with your patch, we would only warn about >> >> var .and. func() >> >> and not about >> >> func() .and. var. >> >> AFAIK, TRUTH_AND_EXPR does not guarantee that func() will >> always be exectued, or if it does, I have not seen the >> documentation; it just happens to match what we currently >> see (which may be due to missed optimizatins in the back end, >> or the lack of test cases exposing this). > > If you are talking about what the middle-end does, TRUTH_AND_EXPR > always evaluates side-effects in both operands, while for > TRUTH_ANDIF_EXPR it evaluates the second operand only if the first operand > is not false.
thanks for the comments. Looking into gfc_conv_expr_op, I see: case INTRINSIC_AND: code = TRUTH_ANDIF_EXPR; lop = 1; break; case INTRINSIC_OR: code = TRUTH_ORIF_EXPR; lop = 1; break; That seems to indicate that Fortran's logical .AND. operator is translated into TRUTH_ANDIF_EXPR, right? Also the empirically observed behavior matches Jakub's description of TRUTH_ANDIF_EXPR, where the first operator is always evaluated and the second one only on demand. Therefore I think my patch is correct in warning about an impure function only if it occurs in the second operand of an and/or operator. Cheers, Janus