https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87603
--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- Specifically, we get a new FAIL when running the libstdc++ tests in c++2a mode: FAIL: 21_strings/basic_string/types/1.cc (test for excess errors) That's because the is_convertible trait instantiates the new c++2a-only __is_nothrow_type member, which instantiates the basic_string_view<X> ctor, which is ill-formed because X isn't equality comparable. I think this might be a rejects-valid example: template<typename T> struct basic_string_view { constexpr basic_string_view(T p) noexcept { (void) p.i; } }; struct X { } x; bool b = noexcept(basic_string_view<X>{x}); ntconv.cc: In instantiation of 'constexpr basic_string_view<T>::basic_string_view(T) [with T = X]': ntconv.cc:10:42: required from here ntconv.cc:5:56: error: 'struct X' has no member named 'i' 5 | constexpr basic_string_view(T p) noexcept { (void) p.i; } | ~~^ If I'm reading the standard correctly, the constructor's noexcept-specifier is instantiated because it's "needed" but that should not cause the instantiation of the function declaration. If the constructor is not constexpr it isn't instantiated when the noexcept-specifier is needed, which is why I think it's related to this bug.