https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117293
Bug ID: 117293 Summary: SFINAE in class partial specialization "leaks" its side-effects Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: m.cencora at gmail dot com Target Milestone: --- It seems like the deprecation warning is kept even if triggered due to failed substitution in context of class partial specialization. In other SFINAE contexts (e.g. a dummy template param of Bar constructor) the deprecation warning is correctly not reported. Following code compiles without a problem on clang. > cat a.cpp template <typename T> T declval(); template<typename Src, typename Dst, typename> struct overload_set; template<typename Src, typename Dst> struct overload_set<Src, Dst, decltype(void(Dst{declval<Src>()}))> { using type = void; }; struct string {}; struct Foo { [[deprecated("dupa")]] Foo(const string&) {}; }; struct Bar { template <typename U, typename overload_set<const U&, Foo, void>::type* = nullptr> Bar(const U&); Bar(const string&); }; int main() { string a; Bar b{a}; } > g++ -std=c++17 -Wall -Wextra -Werror a.cpp This was reduced from custom implementation of variant, but I see that libstdc++ variant uses similar impl with _Build_FUN so may be affected as well.