https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89563
Bug ID: 89563
Summary: decltype resolution doesn't terminate recursion
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: Simon.Richter at hogyros dot de
Target Milestone: ---
Similar to #88176:
struct one {};
struct two
{
two() { }
two(one const &) { }
operator one() const { return one{}; }
two operator+(one const &) const { return two{}; }
};
two operator+(two const &, two const &) { return two{}; }
template<typename T>
auto operator+(T const &lhs, two const &rhs) -> decltype(rhs + lhs)
{
return rhs + lhs;
}
void test()
{
one o;
two t;
auto a = o + t;
}
My original expectation would be that this addition resolves to
auto operator+<one>(one const &lhs, two const &rhs) -> decltype(rhs + lhs);
where the decltype is resolved through
two two::operator+(one const &) const;
This doesn't work, due to #88176, so I've provided a freestanding
two operator+(two const &, two const &);
which terminates the recursion, forcing a conversion through
two::two(one const &);
This works fine, except if
two::operator one() const;
also exists, in which case template recursion again exceeds the maximum depth,
so it seems the option to convert the objects back and forth (even though it
would never be selected during overload resolution) makes decltype resolution
go into the infinite recursion.