[v10,0/5] c++, libstdc++: Make std::is_object dispatch to new built-in traits

Message ID 20230713023731.15571-1-kmatsui@gcc.gnu.org
Headers
Series c++, libstdc++: Make std::is_object dispatch to new built-in traits |

Message

Ken Matsui July 13, 2023, 2:33 a.m. UTC
  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