-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[libc++][concepts] Implements concept helper __libcpp_integer
#78086
[libc++][concepts] Implements concept helper __libcpp_integer
#78086
Conversation
@llvm/pr-subscribers-libcxx Author: Hristo Hristov (H-G-Hristov) Changes...and tests. Full diff: https://github.com/llvm/llvm-project/pull/78086.diff 2 Files Affected:
diff --git a/libcxx/include/__concepts/arithmetic.h b/libcxx/include/__concepts/arithmetic.h
index f41e4c9f2747cc..0c44f117805f36 100644
--- a/libcxx/include/__concepts/arithmetic.h
+++ b/libcxx/include/__concepts/arithmetic.h
@@ -42,9 +42,13 @@ concept floating_point = is_floating_point_v<_Tp>;
template <class _Tp>
concept __libcpp_unsigned_integer = __libcpp_is_unsigned_integer<_Tp>::value;
+
template <class _Tp>
concept __libcpp_signed_integer = __libcpp_is_signed_integer<_Tp>::value;
+template <class _Tp>
+concept __libcpp_integer = __libcpp_unsigned_integer<_Tp> || __libcpp_signed_integer<_Tp>;
+
#endif // _LIBCPP_STD_VER >= 20
_LIBCPP_END_NAMESPACE_STD
diff --git a/libcxx/test/libcxx/concepts/concepts.arithmetic/arithmetic.compile.pass.cpp b/libcxx/test/libcxx/concepts/concepts.arithmetic/arithmetic.compile.pass.cpp
new file mode 100644
index 00000000000000..e234615f544133
--- /dev/null
+++ b/libcxx/test/libcxx/concepts/concepts.arithmetic/arithmetic.compile.pass.cpp
@@ -0,0 +1,118 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+#include <concepts>
+#include <numbers>
+
+struct SomeObject {};
+
+// Concept helpers for the internal type traits for the fundamental types.
+
+// template <class _Tp>
+// concept __libcpp_unsigned_integer;
+
+// Unsigned
+static_assert(std::__libcpp_unsigned_integer<unsigned char>);
+static_assert(std::__libcpp_unsigned_integer<unsigned short int>);
+static_assert(std::__libcpp_unsigned_integer<unsigned int>);
+static_assert(std::__libcpp_unsigned_integer<unsigned long int>);
+static_assert(std::__libcpp_unsigned_integer<unsigned long long int>);
+static_assert(std::__libcpp_unsigned_integer<unsigned short int>);
+#ifndef _LIBCPP_HAS_NO_INT128
+static_assert(std::__libcpp_unsigned_integer<__uint128_t>);
+#endif
+// Signed
+static_assert(!std::__libcpp_unsigned_integer<signed char>);
+static_assert(!std::__libcpp_unsigned_integer<short int>);
+static_assert(!std::__libcpp_unsigned_integer<int>);
+static_assert(!std::__libcpp_unsigned_integer<long int>);
+static_assert(!std::__libcpp_unsigned_integer<long long int>);
+static_assert(!std::__libcpp_unsigned_integer<short int>);
+#ifndef _LIBCPP_HAS_NO_INT128
+static_assert(!std::__libcpp_unsigned_integer<__int128_t>);
+#endif
+// Non-integer
+static_assert(!std::__libcpp_unsigned_integer<bool>);
+static_assert(!std::__libcpp_unsigned_integer<char8_t>);
+static_assert(!std::__libcpp_unsigned_integer<char16_t>);
+static_assert(!std::__libcpp_unsigned_integer<char32_t>);
+static_assert(!std::__libcpp_unsigned_integer<float>);
+static_assert(!std::__libcpp_unsigned_integer<double>);
+static_assert(!std::__libcpp_unsigned_integer<long double>);
+static_assert(!std::__libcpp_unsigned_integer<void>);
+static_assert(!std::__libcpp_unsigned_integer<SomeObject>);
+
+// template <class _Tp>
+// concept __libcpp_signed_integer;
+
+// Unsigned
+static_assert(!std::__libcpp_signed_integer<unsigned char>);
+static_assert(!std::__libcpp_signed_integer<unsigned short int>);
+static_assert(!std::__libcpp_signed_integer<unsigned int>);
+static_assert(!std::__libcpp_signed_integer<unsigned long int>);
+static_assert(!std::__libcpp_signed_integer<unsigned long long int>);
+static_assert(!std::__libcpp_signed_integer<unsigned short int>);
+#ifndef _LIBCPP_HAS_NO_INT128
+static_assert(!std::__libcpp_signed_integer<__uint128_t>);
+#endif
+// Signed
+static_assert(std::__libcpp_signed_integer<signed char>);
+static_assert(std::__libcpp_signed_integer<short int>);
+static_assert(std::__libcpp_signed_integer<int>);
+static_assert(std::__libcpp_signed_integer<long int>);
+static_assert(std::__libcpp_signed_integer<long long int>);
+static_assert(std::__libcpp_signed_integer<short int>);
+#ifndef _LIBCPP_HAS_NO_INT128
+static_assert(std::__libcpp_signed_integer<__int128_t>);
+#endif
+// Non-integer
+static_assert(!std::__libcpp_signed_integer<bool>);
+static_assert(!std::__libcpp_signed_integer<char8_t>);
+static_assert(!std::__libcpp_signed_integer<char16_t>);
+static_assert(!std::__libcpp_signed_integer<char32_t>);
+static_assert(!std::__libcpp_signed_integer<float>);
+static_assert(!std::__libcpp_signed_integer<double>);
+static_assert(!std::__libcpp_signed_integer<long double>);
+static_assert(!std::__libcpp_signed_integer<void>);
+static_assert(!std::__libcpp_signed_integer<SomeObject>);
+
+// template <class _Tp>
+// concept __libcpp_integer;
+
+// Unsigned
+static_assert(std::__libcpp_integer<unsigned char>);
+static_assert(std::__libcpp_integer<unsigned short int>);
+static_assert(std::__libcpp_integer<unsigned int>);
+static_assert(std::__libcpp_integer<unsigned long int>);
+static_assert(std::__libcpp_integer<unsigned long long int>);
+static_assert(std::__libcpp_integer<unsigned short int>);
+#ifndef _LIBCPP_HAS_NO_INT128
+static_assert(std::__libcpp_integer<__uint128_t>);
+#endif
+// Signed
+static_assert(std::__libcpp_integer<signed char>);
+static_assert(std::__libcpp_integer<short int>);
+static_assert(std::__libcpp_integer<int>);
+static_assert(std::__libcpp_integer<long int>);
+static_assert(std::__libcpp_integer<long long int>);
+static_assert(std::__libcpp_integer<short int>);
+#ifndef _LIBCPP_HAS_NO_INT128
+static_assert(std::__libcpp_integer<__int128_t>);
+#endif
+// Non-integer
+static_assert(!std::__libcpp_integer<bool>);
+static_assert(!std::__libcpp_integer<char8_t>);
+static_assert(!std::__libcpp_integer<char16_t>);
+static_assert(!std::__libcpp_integer<char32_t>);
+static_assert(!std::__libcpp_integer<float>);
+static_assert(!std::__libcpp_integer<double>);
+static_assert(!std::__libcpp_integer<long double>);
+static_assert(!std::__libcpp_integer<void>);
+static_assert(!std::__libcpp_integer<SomeObject>);
|
@mordante @frederick-vs-ja This adds
|
4ab449d
to
f2008de
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mordante @frederick-vs-ja This adds
std::__libcpp_integer
concept as a prerequisite from this discussion: #77967 (comment)* Any ideas for an alternative name, e.g. * `std::__libcpp_true_integer` * `std::__libcpp_integer_type` * I have not replaced `__is_safe_integral_cmp` in this patch as suggested [[libc++][numeric] P0543R3: Saturation arithmetic #77967 (comment)](https://github.com/llvm/llvm-project/pull/77967#discussion_r1451099830). I can do it in a follow-up patch.
Thanks. I would keep the name as is. Why do you want to provide different names.
LGTM modulo some small nits.
libcxx/test/libcxx/concepts/concepts.arithmetic/arithmetic.compile.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/libcxx/concepts/concepts.arithmetic/arithmetic.compile.pass.cpp
Outdated
Show resolved
Hide resolved
Thank you! Never mind the question then. |
|
I've seen that happen before :-/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! Thanks! Please ping me when you've update your other patch with these changes.
Thank you! I'll ping you when I am ready with the other patch. I still need to implement additional tests. |
Implements: https://wg21.link/P0543R3 - https://eel.is/c++draft/numeric.sat Additional references: - Division: https://eel.is/c++draft/expr.mul#4 - Arithmetic conversions: https://eel.is/c++draft/expr.arith.conv#1 - Clang builtins: https://clang.llvm.org/docs/LanguageExtensions.html#builtin-functions Depends on: #78086 --------- Co-authored-by: Zingam <zingam@outlook.com> Co-authored-by: Mark de Wever <zar-rpg@xs4all.nl>
…#78086) ...and tests. --------- Co-authored-by: Zingam <zingam@outlook.com>
Implements: https://wg21.link/P0543R3 - https://eel.is/c++draft/numeric.sat Additional references: - Division: https://eel.is/c++draft/expr.mul#4 - Arithmetic conversions: https://eel.is/c++draft/expr.arith.conv#1 - Clang builtins: https://clang.llvm.org/docs/LanguageExtensions.html#builtin-functions Depends on: llvm/llvm-project#78086 --------- Co-authored-by: Zingam <zingam@outlook.com> Co-authored-by: Mark de Wever <zar-rpg@xs4all.nl> NOKEYCHECK=True GitOrigin-RevId: 03c19e91e8d8cb706b58e02d69f80caeaf7eb0f4
...and tests.