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