https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119897
Bug ID: 119897
Summary: Conversion to any integer type succeeds, when should
be ambiguous
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: barry.revzin at gmail dot com
Target Milestone: ---
This example:
struct X {
template <typename T>
operator T() const;
#if BOOL
operator bool() const;
#endif
};
bool check(X x, int v) {
return x == v;
}
The expected behavior is that this ambiguous, regardless of the presence of
BOOL, since [over.built] gives us a lot of equivalently viable candidates to
that operator== (we can convert to float, double, int, long, the unsigned
versions, ...)
But gcc's behavior is:
* with BOOL=0: doesn't compile, but the error says *no* match for operator==.
It's the correct result, but the diagnostic isn't quite right.
* with BOOL=1: does compile, selecting x.operator int().
But the presence of operator bool() shouldn't matter here, and there's no
reason to prefer operator int() over operator long() or operator float() or ...