15
15
16
16
#include < algorithm>
17
17
#include < cassert>
18
+ #include < cstddef>
18
19
#include < memory>
19
20
#include < string>
20
21
@@ -77,17 +78,67 @@ constexpr bool test() {
77
78
return true ;
78
79
}
79
80
80
- void test_value_categories () {
81
+ constexpr bool test_value_categories () {
81
82
std::string s;
82
83
s.resize_and_overwrite (10 , [](char *&&, std::size_t &&) { return 0 ; });
83
84
LIBCPP_ASSERT (is_string_asan_correct (s));
84
85
s.resize_and_overwrite (10 , [](char * const &, const std::size_t &) { return 0 ; });
85
86
LIBCPP_ASSERT (is_string_asan_correct (s));
86
87
struct RefQualified {
87
- int operator ()(char *, std::size_t ) && { return 0 ; }
88
+ constexpr int operator ()(char *, std::size_t ) && { return 0 ; }
88
89
};
89
90
s.resize_and_overwrite (10 , RefQualified{});
90
91
LIBCPP_ASSERT (is_string_asan_correct (s));
92
+ return true ;
93
+ }
94
+
95
+ constexpr bool test_integer_like_return_types () {
96
+ std::string s;
97
+
98
+ // Test various integer-like types
99
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> int {
100
+ std::fill (p, p + n, ' a' );
101
+ return 5 ;
102
+ });
103
+ assert (s.size () == 5 );
104
+ assert (s == " aaaaa" );
105
+
106
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> unsigned int {
107
+ std::fill (p, p + n, ' b' );
108
+ return 5u ;
109
+ });
110
+ assert (s.size () == 5 );
111
+ assert (s == " bbbbb" );
112
+
113
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> long {
114
+ std::fill (p, p + n, ' c' );
115
+ return 5l ;
116
+ });
117
+ assert (s.size () == 5 );
118
+ assert (s == " ccccc" );
119
+
120
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> unsigned long {
121
+ std::fill (p, p + n, ' d' );
122
+ return 5ul ;
123
+ });
124
+ assert (s.size () == 5 );
125
+ assert (s == " ddddd" );
126
+
127
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> long long {
128
+ std::fill (p, p + n, ' e' );
129
+ return 5ll ;
130
+ });
131
+ assert (s.size () == 5 );
132
+ assert (s == " eeeee" );
133
+
134
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> unsigned long long {
135
+ std::fill (p, p + n, ' f' );
136
+ return 5ull ;
137
+ });
138
+ assert (s.size () == 5 );
139
+ assert (s == " fffff" );
140
+
141
+ return true ;
91
142
}
92
143
93
144
int main (int , char **) {
@@ -105,5 +156,12 @@ int main(int, char**) {
105
156
test<std::basic_string<wchar_t , std::char_traits<wchar_t >, std::allocator<wchar_t >>>();
106
157
static_assert (test<std::basic_string<wchar_t , std::char_traits<wchar_t >, std::allocator<wchar_t >>>());
107
158
#endif
159
+
160
+ test_value_categories ();
161
+ test_integer_like_return_types ();
162
+
163
+ static_assert (test_value_categories ());
164
+ static_assert (test_integer_like_return_types ());
165
+
108
166
return 0 ;
109
167
}
0 commit comments