https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110904
Bug ID: 110904 Summary: __is_convertible incorrectly reports non-referenceable function prototypes as convertible Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: nikolasklauser at berlin dot de Target Milestone: --- ``` #include <utility> using Function = void(); using ConstFunction = void() const; static_assert((!std::is_convertible<ConstFunction, Function>::value), ""); static_assert((!std::is_convertible<ConstFunction, Function*>::value), ""); // convertible static_assert((!std::is_convertible<ConstFunction, Function&>::value), ""); // convertible static_assert((!std::is_convertible<ConstFunction, Function&&>::value), ""); // convertible static_assert((!std::is_convertible<Function*, ConstFunction>::value), ""); static_assert((!std::is_convertible<Function&, ConstFunction>::value), ""); static_assert((!std::is_convertible<ConstFunction, ConstFunction>::value), ""); static_assert((!std::is_convertible<ConstFunction, void>::value), ""); ``` __is_convertible() claims that the cases marked above are convertible, but AFAICT that shouldn't be true. According to the standard, ``` To test() { return declval<From>(); } ``` has to be well formed, but that's never the case for `ConstFunction`.