[libcxx-commits] [libcxx] [libc++][string] Assert resize_and_overwrite operation returns integer-like type (PR #162030)
NagaChaitanya Vellanki via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Oct 8 08:46:41 PDT 2025
================
@@ -77,17 +78,35 @@ constexpr bool test() {
return true;
}
-void test_value_categories() {
+constexpr bool test_value_categories() {
std::string s;
s.resize_and_overwrite(10, [](char*&&, std::size_t&&) { return 0; });
LIBCPP_ASSERT(is_string_asan_correct(s));
s.resize_and_overwrite(10, [](char* const&, const std::size_t&) { return 0; });
LIBCPP_ASSERT(is_string_asan_correct(s));
struct RefQualified {
- int operator()(char*, std::size_t) && { return 0; }
+ constexpr int operator()(char*, std::size_t) && { return 0; }
};
s.resize_and_overwrite(10, RefQualified{});
LIBCPP_ASSERT(is_string_asan_correct(s));
+ return true;
+}
+
+template <typename T>
+struct TestIntegerLikeReturnTypes {
+ constexpr void operator()() {
+ std::string s;
+ s.resize_and_overwrite(10, [](char* p, std::size_t n) -> T {
+ std::fill(p, p + n, 'f');
+ return n;
+ });
+ assert(s.size() == 10);
+ }
+};
----------------
chaitanyav wrote:
because thats the way most tests have been written, i followed the same convention.
```c++
struct TestInt {
47 │ template <class T>
48 │ static TEST_CONSTEXPR_CXX23 bool test() {
49 │ assert(std::isnormal(std::numeric_limits<T>::max()));
50 │ assert(std::isnormal(std::numeric_limits<T>::lowest()) == std::is_signed<T>::value);
51 │ assert(!std::isnormal(T(0)));
52 │
53 │ return true;
54 │ }
```
```c++
struct TestFloat {
22 │ template <class T>
23 │ static TEST_CONSTEXPR_CXX23 bool test() {
24 │ assert(std::isnormal(std::numeric_limits<T>::max()));
25 │ assert(!std::isnormal(std::numeric_limits<T>::infinity()));
26 │ assert(std::isnormal(std::numeric_limits<T>::min()));
27 │ assert(!std::isnormal(std::numeric_limits<T>::denorm_min()));
28 │ assert(std::isnormal(std::numeric_limits<T>::lowest()));
29 │ assert(!std::isnormal(-std::numeric_limits<T>::infinity()));
30 │ assert(!std::isnormal(T(0)));
31 │ assert(!std::isnormal(std::numeric_limits<T>::quiet_NaN()));
32 │ assert(!std::isnormal(std::numeric_limits<T>::signaling_NaN()));
33 │
34 │ return true;
35 │ }
36 │
```
```c++
struct TestFloat {
28 │ template <class T>
29 │ static TEST_CONSTEXPR_CXX23 bool test() {
30 │ assert(!std::signbit(T(0)));
31 │ assert(!std::signbit(std::numeric_limits<T>::min()));
32 │ assert(!std::signbit(std::numeric_limits<T>::denorm_min()));
33 │ assert(!std::signbit(std::numeric_limits<T>::max()));
34 │ assert(!std::signbit(std::numeric_limits<T>::infinity()));
35 │ assert(!std::signbit(std::numeric_limits<T>::quiet_NaN()));
36 │ assert(!std::signbit(std::numeric_limits<T>::signaling_NaN()));
37 │ assert(std::signbit(-T(0)));
38 │ assert(std::signbit(-std::numeric_limits<T>::infinity()));
39 │ assert(std::signbit(std::numeric_limits<T>::lowest()));
40 │
41 │ return true;
42 │ }
```
https://github.com/llvm/llvm-project/pull/162030
More information about the libcxx-commits
mailing list