1515
1616#include < algorithm>
1717#include < cassert>
18+ #include < cstddef>
1819#include < memory>
1920#include < string>
2021
@@ -77,17 +78,67 @@ constexpr bool test() {
7778 return true ;
7879}
7980
80- void test_value_categories () {
81+ constexpr bool test_value_categories () {
8182 std::string s;
8283 s.resize_and_overwrite (10 , [](char *&&, std::size_t &&) { return 0 ; });
8384 LIBCPP_ASSERT (is_string_asan_correct (s));
8485 s.resize_and_overwrite (10 , [](char * const &, const std::size_t &) { return 0 ; });
8586 LIBCPP_ASSERT (is_string_asan_correct (s));
8687 struct RefQualified {
87- int operator ()(char *, std::size_t ) && { return 0 ; }
88+ constexpr int operator ()(char *, std::size_t ) && { return 0 ; }
8889 };
8990 s.resize_and_overwrite (10 , RefQualified{});
9091 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 ;
91142}
92143
93144int main (int , char **) {
@@ -105,5 +156,12 @@ int main(int, char**) {
105156 test<std::basic_string<wchar_t , std::char_traits<wchar_t >, std::allocator<wchar_t >>>();
106157 static_assert (test<std::basic_string<wchar_t , std::char_traits<wchar_t >, std::allocator<wchar_t >>>());
107158#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+
108166 return 0 ;
109167}
0 commit comments