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 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>::value)> 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 v8 * Dropped __is_void built-in implementation since it is optimal. * Optimized is_function_v Ken Matsui (5): 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 libstdc++: Make std::is_object dispatch to new built-in traits gcc/cp/constraint.cc | 6 +++ gcc/cp/cp-trait.def | 2 + gcc/cp/semantics.cc | 8 ++++ gcc/testsuite/g++.dg/ext/has-builtin-1.C | 6 +++ gcc/testsuite/g++.dg/ext/is_function.C | 58 ++++++++++++++++++++++++ gcc/testsuite/g++.dg/ext/is_reference.C | 34 ++++++++++++++ libstdc++-v3/include/std/type_traits | 50 +++++++++++++++++++- 7 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ext/is_function.C create mode 100644 gcc/testsuite/g++.dg/ext/is_reference.C -- 2.41.0