https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104606
Bug ID: 104606 Summary: Regression in comparison operator resolution with std::optional Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: julien.philippon at epitech dot eu Target Milestone: --- Created attachment 52480 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52480&action=edit Preprocessed file trigering the regression This code used to compile with G++ 11.1 but does not anymore with G++ 11.2 : ``` #include <optional> #include <variant> #include <vector> struct Value : public std::variant<int, std::vector<Value>> { using variant::variant; }; struct Comparator { template <typename T> bool operator<=(const T &rhs) { return true; } }; int main() { auto test = Comparator() <= Value{1}; auto test2 = Comparator() <= std::make_optional(Value{1}); } ``` In GCC 11.1 the comparison correctly deduced in the two cases that the lower or equal operator of Comparator should be used, but in GCC 11.2, the second comparison which involve an optional fails to compile. It looks like GCC is trying to instantiate the three-way comparison operator of Value, instead of using the operator of Comparator. Output from g++ -v : ``` Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-multilib --enable-pgo-build=lto --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --with-build-config=bootstrap-lto --enable-link-serialization=1 gdc_include_dir=/usr/include/dlang/gdc Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.2.0 (GCC) ```