https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118458
--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #8) > (In reply to Stephen Berry from comment #7) > > I should clarify that GCC doesn't appear to emit this warning after GCC13. > > So, in this case I was looking for a solution for older versions of GCC. > > This request was written generically, so that the issue could be avoided in > > the future for warnings that developers want to disable. > > There is no solution for older versions of GCC since it won't be changed. Also I tried with GCC 10, 11 and 12 and none of them warn for me either: ``` #include <concepts> #include <cstddef> #include <string_view> namespace glz { namespace detail { struct any_t final { #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Weverything" template <class T> requires(!std::same_as<T, const char*> && !std::same_as<T, std::nullptr_t>) [[maybe_unused]] constexpr operator T() const; #pragma clang diagnostic pop #elif defined(_MSC_VER) template <class T> requires(!std::same_as<T, const char*> && !std::same_as<T, std::nullptr_t>) [[maybe_unused]] constexpr operator T() const; #else //#pragma GCC diagnostic push //#pragma GCC diagnostic ignored "-Wmissing-declarations" template <class T> requires(!std::same_as<T, const char*> && !std::same_as<T, std::nullptr_t>) [[maybe_unused]] constexpr operator T() const; //#pragma GCC diagnostic pop #endif [[maybe_unused]] constexpr operator std::string_view() const { return {}; } }; template <class T, class... Args> requires(std::is_aggregate_v<std::remove_cvref_t<T>>) inline constexpr auto count_members = [] { using V = std::remove_cvref_t<T>; if constexpr (requires { V{Args{}..., any_t{}}; }) { return count_members<V, Args..., any_t>; } else { return sizeof...(Args); } }(); constexpr size_t max_pure_reflection_count = 128; } template <class T, int N = detail::count_members<T>> constexpr int f() { return N; } } struct f1{ int t; int tt; }; int h = glz::f<f1>(); ```