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,60 @@ 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
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> int {
99
+ std::fill (p, p + 5 , ' a' );
100
+ return 5 ;
101
+ });
102
+ assert (s.size () == 5 );
103
+
104
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> unsigned int {
105
+ std::fill (p, p + 3 , ' b' );
106
+ return 3u ;
107
+ });
108
+ assert (s.size () == 3 );
109
+
110
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> long {
111
+ std::fill (p, p + 7 , ' c' );
112
+ return 7l ;
113
+ });
114
+ assert (s.size () == 7 );
115
+
116
+ s.resize_and_overwrite (20 , [](char * p, std::size_t n) -> unsigned long {
117
+ std::fill (p, p + 4 , ' d' );
118
+ return 4ul ;
119
+ });
120
+ assert (s.size () == 4 );
121
+
122
+ s.resize_and_overwrite (15 , [](char * p, std::size_t n) -> long long {
123
+ std::fill (p, p + 8 , ' e' );
124
+ return 8ll ;
125
+ });
126
+ assert (s.size () == 8 );
127
+
128
+ s.resize_and_overwrite (10 , [](char * p, std::size_t n) -> unsigned long long {
129
+ std::fill (p, p + n, ' f' );
130
+ return n;
131
+ });
132
+ assert (s.size () == 10 );
133
+
134
+ return true ;
91
135
}
92
136
93
137
int main (int , char **) {
@@ -105,5 +149,12 @@ int main(int, char**) {
105
149
test<std::basic_string<wchar_t , std::char_traits<wchar_t >, std::allocator<wchar_t >>>();
106
150
static_assert (test<std::basic_string<wchar_t , std::char_traits<wchar_t >, std::allocator<wchar_t >>>());
107
151
#endif
152
+
153
+ test_value_categories ();
154
+ test_integer_like_return_types ();
155
+
156
+ static_assert (test_value_categories ());
157
+ static_assert (test_integer_like_return_types ());
158
+
108
159
return 0 ;
109
160
}
0 commit comments