https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118029
Bug ID: 118029
Summary: Wrong location info in caret diagnostic about enum &=
enum|enum
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: diagnostic
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
enum E { E0, E1, E2 };
E operator|(E lhs, E rhs) { return E(int(lhs) | int(rhs)); }
void f(E e)
{
e &= E1;
e &= E1|E2;
}
This gives two errors, as expected:
e2.cc: In function ‘void f(E)’:
e2.cc:6:5: error: invalid conversion from ‘int’ to ‘E’ [-fpermissive]
6 | e &= E1;
| ~~^~~~~
| |
| int
e2.cc:7:11: error: invalid conversion from ‘int’ to ‘E’ [-fpermissive]
7 | e &= E1|E2;
| ^~
| |
| int
The first error highlights the entire expression which is fine.
The second one highlights E2 which is highly confusing, since neither E2 nor
E1|E2 has type int. The overloaded operator| ensures that E1|E2 has type E and
so the error on line 7 is exactly equivalent to the one on line 6.
I would expect line 7 to show something closer to the error for line 6, i.e.
7 | e &= E1|E2;
| ~~^~~~~~~~
| |
| int
However, neither of the errors is really that helpful. Where is the 'int'
coming from? The user has to know that the &= expression works like e = (e &
E1) where (e & E1) is valid but produces an int, and that the problem is in the
assignment of an int to e.
EDG gives a much better error here:
"e2.cc", line 6: error: this operation on an enumerated type requires an
applicable user-defined operator function
e &= E1;
^
"e2.cc", line 7: error: this operation on an enumerated type requires an
applicable user-defined operator function
e &= E1|E2;
^
2 errors detected in the compilation of "e2.cc".
This describes the actual issue: the built-in &= simply doesn't work for
enumeration types. This is much more helpful than saying 'int' can't convert
to E when there's no 'int' visible in the code.
Ideally we'd say something similar, but in the absence of a clear explanation
of the problem, we should not highlight an incorrect subexpression.