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

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
For extra fun:

enum E { E0, E1, E2 };
E operator|(E lhs, E rhs) { return E(int(lhs) | int(rhs)); }

void f(E e)
{
  e |= E1|E2;
}

e2.cc: In function 'void f(E)':
e2.cc:6:11: error: invalid conversion from 'int' to 'E' [-fpermissive]
    6 |   e |= E1|E2;
      |           ^~
      |           |
      |           int


Now this seems really bad. If the user understands that a |= b works like a =
a|b then it's really confusing where the int comes from, because a|b isn't an
int.

So they have to know that it's a bit like a=a|b but not really.

Again, EDG is great:

"e2.cc", line 6: error: this operation on an enumerated type requires an
          applicable user-defined operator function
    e |= E1|E2;
      ^

1 error detected in the compilation of "e2.cc".


This clearly states that the built-in |= will never work, it doesn't matter
what the type of the right operand is.

EDG gives this diagnostic for all compound assignments that don't have a
user-defined overload. G++ only seems to be confusing for the bitwise compound
assignments &= and |= and ^=

For += on enums G++ is less confusing (although still not as user-friendly as
EDG):

e2.cc:6:5: error: no match for 'operator+=' (operand types are 'E' and 'E')
    6 |   e += E1|E2;
      |   ~~^~~~~~~~

Reply via email to