libstdc++: Fix constraint on std::basic_format_string [PR108024]

Also remove some redundant std::move calls for return statements.

libstdc++-v3/ChangeLog:

	PR libstdc++/108024
	* include/std/format (basic_format_string): Fix constraint.
	* testsuite/std/format/format_string.cc: New test.
This commit is contained in:
Jonathan Wakely 2022-12-12 11:40:07 +00:00
parent cb363fd9f1
commit 6c0f958401
2 changed files with 22 additions and 4 deletions

View file

@ -110,7 +110,8 @@ namespace __format
template<typename _CharT, typename... _Args>
struct basic_format_string
{
template<convertible_to<basic_string_view<_CharT>> _Tp>
template<typename _Tp>
requires convertible_to<const _Tp&, basic_string_view<_CharT>>
consteval
basic_format_string(const _Tp& __s);
@ -609,7 +610,7 @@ namespace __format
else
for (_CharT __c : __str)
*__out++ = __c;
return std::move(__out);
return __out;
}
// Write STR to OUT with NFILL copies of FILL_CHAR specified by ALIGN.
@ -664,7 +665,7 @@ namespace __format
__out = __format::__write(std::move(__out), __str);
__pad(__r, __out);
return std::move(__out);
return __out;
}
// A lightweight optional<locale>.
@ -3626,7 +3627,8 @@ namespace __format
/// @endcond
template<typename _CharT, typename... _Args>
template<convertible_to<basic_string_view<_CharT>> _Tp>
template<typename _Tp>
requires convertible_to<const _Tp&, basic_string_view<_CharT>>
consteval
basic_format_string<_CharT, _Args...>::
basic_format_string(const _Tp& __s)

View file

@ -0,0 +1,16 @@
// { dg-options "-std=gnu++20" }
// { dg-do compile { target c++20 } }
#include <format>
struct Str
{
consteval operator std::string_view() const { return ""; }
operator std::string_view() = delete;
};
// PR libstdc++/108024
static_assert( std::is_constructible_v<std::format_string<>, const Str&> );
static_assert( std::is_convertible_v<const Str&, std::format_string<>> );
constinit std::format_string<> s = Str();