https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99846
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
We can reduce this further:
#include <variant>
#include <list>
struct Value;
using Array = std::list<Value>;
using Variant = std::variant<Array>;
struct Value : Variant {};
int main()
{
Value left;
Value right;
return left < right;
}
Now this is *obviously* wrong. The left < right expression uses the operator<
defined for the std::list<Value> base class, which depends on comparing the
list's elements, which obviously recurses.
Adding std::variant doesn't really change anything. The operator< for
std::variant depends on comparing its alternative types, which is a list of the
variants.
I don't see how this can work when implemented as required by the standard.