Hi, This patch series gets std::is_object to dispatch to built-in traits and implements the following built-in traits, on which std::object depends.
* __is_reference * __is_function * __is_void std::is_object was depending on them with disjunction and negation. __not_<__or_<is_function<_Tp>, is_reference<_Tp>, is_void<_Tp>>>::type Therefore, this patch uses them directly instead of implementing an additional built-in trait __is_object, which makes the compiler slightly bigger and slower. __bool_constant<!(__is_function(_Tp) || __is_reference(_Tp) || __is_void(_Tp))> This would instantiate only __bool_constant<true> and __bool_constant<false>, which can be mostly shared. That is, the purpose of built-in traits is considered as achieved. Changes in v2 * Stopped using std::is_void in helper_functions.h * Squashed is_void-related commits into the commit of is_void implementation Ken Matsui (7): c++: implement __is_reference built-in trait libstdc++: use new built-in trait __is_reference for std::is_reference c++: implement __is_function built-in trait libstdc++: use new built-in trait __is_function for std::is_function c++, libstdc++: implement __is_void built-in trait libstdc++: use new built-in trait __is_void for std::is_void libstdc++: make std::is_object dispatch to new built-in traits gcc/cp/constraint.cc | 9 +++ gcc/cp/cp-trait.def | 3 + gcc/cp/semantics.cc | 12 ++++ gcc/testsuite/g++.dg/ext/has-builtin-1.C | 9 +++ gcc/testsuite/g++.dg/ext/is_function.C | 58 +++++++++++++++++++ gcc/testsuite/g++.dg/ext/is_reference.C | 34 +++++++++++ gcc/testsuite/g++.dg/ext/is_void.C | 35 +++++++++++ gcc/testsuite/g++.dg/tm/pr46567.C | 6 +- libstdc++-v3/include/bits/cpp_type_traits.h | 15 ----- libstdc++-v3/include/debug/helper_functions.h | 5 +- libstdc++-v3/include/std/type_traits | 30 ++++++++++ 11 files changed, 195 insertions(+), 21 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/is_function.C create mode 100644 gcc/testsuite/g++.dg/ext/is_reference.C create mode 100644 gcc/testsuite/g++.dg/ext/is_void.C -- 2.40.0