Hi, For those curious about the performance improvements of this patch, I conducted a benchmark that instantiates 256k specializations of is_object_v based on Patrick's code. You can find the benchmark code at this link:
https://github.com/ken-matsui/gcc-benches/blob/main/is_object_benchmark.cc On my computer, using the gcc HEAD of this patch for a release build, the patch with -DUSE_BUILTIN took 64% less time and used 44-47% less memory compared to not using it. Sincerely, Ken Matsui On Mon, Jun 12, 2023 at 3:49 PM Ken Matsui <kmat...@cs.washington.edu> wrote: > > 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 v7 > > * Removed an unnecessary new line. > > Ken Matsui (6): > 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++: 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 | 51 ++++++++++++++++ > 11 files changed, 216 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.41.0 >