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

            Bug ID: 91987
           Summary: -fstrict-eval-order issues
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
                CC: barry.revzin at gmail dot com, jakub at gcc dot gnu.org,
                    webrown.cpp at gmail dot com
        Depends on: 91974
  Target Milestone: ---

+++ This bug was initially created as a clone of Bug #91974 +++

I wonder if we don't need to double check all the C++17 evaluation rules for
similar problems as the above bug for call expressions.

At least:
int
foo (void)
{
  int x = 5;
  return x << (x = 3, 2);
}

int
main ()
{
  if (foo () != (5 << 2))
    __builtin_abort ();
}

fails when compiled with g++ trunk and icpc 19, but succeeds with clang++.
The problem is similar, we gimplify_expr the left operand before right operand
in this case and think it is enough, but because it is gimplified to a VAR_DECL
which satisfies the predicate, yet is a user variable that can be overwritten
in the expression that needs to be sequenced after it, we don't actually
enforce the language rules.
Not sure what is the right way to deal with this.
Depend on flag_strong_eval_order (which is in c-family/c.opt!) in the
gimplifier and use different predicates in that case that will enforce it (how
to distinguish between fresh gimplifier temporaries that aren't problematic vs.
variables that can be overwritten?  Is DECL_ARTIFICIAL usable for this, or can
we have DECL_ARTIFICAL vars that can be overwritten?  Or wrap the operands in
NON_LVALUE_EXPR or similar?


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91974
[Bug 91974] function not sequenced before function argument

Reply via email to