Message ID | 20190614140507.GA24550@redhat.com |
---|---|
State | New |
Headers | show |
Series | Disable -Wctor-dtor-privacy warnings for some standard types | expand |
Am Fr., 14. Juni 2019 um 16:05 Uhr schrieb Jonathan Wakely <jwakely@redhat.com>: > > These types are not constructible by design, so we never want warnings > for them, even with -Wsystem-headers. > > * include/experimental/type_traits (experimental::nonesuch): Use > pragma to disable -Wctor-dtor-privacy warnings. > * include/std/type_traits (__is_convertible_helper<From, To, false>) > (__is_nt_convertible_helper<From, To, false>, __nonesuch): Likewise. > > Tested x86_64-linux, committed to trunk. Unless I'm misunderstanding something, __nonesuchbase (twice) would not be affected by that warning, so maybe the start of the corresponding warning suppression could be moved after their definition? Or did you do it that way to keep __nonesuchbase and nonesuch close together? - Daniel
Am Sa., 15. Juni 2019 um 12:52 Uhr schrieb Daniel Krügler <daniel.kruegler@gmail.com>: > > Am Fr., 14. Juni 2019 um 16:05 Uhr schrieb Jonathan Wakely <jwakely@redhat.com>: > > > > These types are not constructible by design, so we never want warnings > > for them, even with -Wsystem-headers. > > > > * include/experimental/type_traits (experimental::nonesuch): Use > > pragma to disable -Wctor-dtor-privacy warnings. > > * include/std/type_traits (__is_convertible_helper<From, To, false>) > > (__is_nt_convertible_helper<From, To, false>, __nonesuch): Likewise. > > > > Tested x86_64-linux, committed to trunk. > > Unless I'm misunderstanding something, __nonesuchbase (twice) would > not be affected by that warning, so maybe the start of the > corresponding warning suppression could be moved after their > definition? Or did you do it that way to keep __nonesuchbase and > nonesuch close together? Jonathan is momentarily not able to respond to this list using proper email format, but he responded to me in private as follows: "I did do that to keep them together, rather than introducing white space between the base and the class using it. I even considered putting the pragmas around the whole file, but decided to add them just locally where needed. I don't mind moving the base struct out of the pragma if you or anybody else feels strongly, but thought it didn't do any harm this way." Personally I don't feel strongly about it - Thanks for the explanation! - Daniel
diff --git a/libstdc++-v3/include/experimental/type_traits b/libstdc++-v3/include/experimental/type_traits index 2403bd24223..464c8d2f4bf 100644 --- a/libstdc++-v3/include/experimental/type_traits +++ b/libstdc++-v3/include/experimental/type_traits @@ -227,6 +227,8 @@ inline namespace fundamentals_v2 template<typename...> using void_t = void; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" struct __nonesuchbase {}; struct nonesuch : private __nonesuchbase { @@ -234,6 +236,7 @@ struct nonesuch : private __nonesuchbase nonesuch(nonesuch const&) = delete; void operator=(nonesuch const&) = delete; }; +#pragma GCC diagnostic pop template<template<typename...> class _Op, typename... _Args> using is_detected diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index e53d3c8d535..7d4deb156a1 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -1448,6 +1448,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef typename is_void<_To>::type type; }; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" template<typename _From, typename _To> class __is_convertible_helper<_From, _To, false> { @@ -1466,7 +1468,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: typedef decltype(__test<_From, _To>(0)) type; }; - +#pragma GCC diagnostic pop /// is_convertible template<typename _From, typename _To> @@ -1481,6 +1483,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : is_void<_To> { }; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" template<typename _From, typename _To> class __is_nt_convertible_helper<_From, _To, false> { @@ -1499,6 +1503,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: using type = decltype(__test<_From, _To>(0)); }; +#pragma GCC diagnostic pop // is_nothrow_convertible for C++11 template<typename _From, typename _To> @@ -2894,12 +2899,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __call_is_nothrow_<_Fn, _Args...>>::type { }; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" struct __nonesuchbase {}; struct __nonesuch : private __nonesuchbase { ~__nonesuch() = delete; __nonesuch(__nonesuch const&) = delete; void operator=(__nonesuch const&) = delete; }; +#pragma GCC diagnostic pop #if __cplusplus >= 201703L # define __cpp_lib_is_invocable 201703