https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99846
--- Comment #8 from Nils Gladitz <nilsgladitz at gmail dot com> --- (In reply to Jonathan Wakely from comment #5) > 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. Maybe my original test case was reduced a bit too far. Recursive but bounded example which maybe is a little closer to the original case and I hope maybe a little less obviously wrong: #include <list> #include <iostream> #include <variant> struct Value; using Array = std::list<Value>; using Variant = std::variant<int, Array>; struct Value : Variant { using Variant::variant; }; int main() { Value left = Array{2, Array{}, 3}; Value right = Array{1}; std::cout << "<\t" << (left < right) << std::endl; std::cout << ">\t" << (left > right) << std::endl; std::cout << "==\t" << (left == right) << std::endl; }