constexpr void
basic_format_parse_context<_CharT>::check_dynamic_spec(size_t __id) noexcept
{
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4142. check_dynamic_spec should require at least one type
+ static_assert(sizeof...(_Ts) >= 1);
// This call enforces the Mandates: condition that _Ts contains valid
// types and each type appears at most once. It could be a static_assert
// but this way failures give better diagnostics, due to calling the
std::format_parse_context pc("{1}.{2}");
// None of these calls should do anything at runtime, only during consteval:
- pc.check_dynamic_spec<>(0);
pc.check_dynamic_spec<int, const char*>(0);
pc.check_dynamic_spec_integral(0);
pc.check_dynamic_spec_string(0);
pc.check_dynamic_spec<bool, char, int, unsigned, long long,
unsigned long long, float, double, long double,
const char*, std::string_view, const void*>(0);
- // For some reason, an empty pack of types is valid:
- pc.check_dynamic_spec<>(0);
+
+ // LWG 4142. check_dynamic_spec should require at least one type
+ pc.check_dynamic_spec<>(0); // { dg-error "here" }
pc.check_dynamic_spec<void>(0); // { dg-error "here" }
// const void* is allowed, but void* is not
pc.check_dynamic_spec<char8_t>(0); // { dg-error "here" }
// std::string_view is allowed, but std::string is not
pc.check_dynamic_spec<std::string>(0); // { dg-error "here" }
+ // The types in the pack must be unique.
pc.check_dynamic_spec<int, bool, int>(0); // { dg-error "here" }
std::wformat_parse_context wpc(L"");
// Each failure above will point to a call to this non-constexpr function:
// { dg-error "__invalid_dynamic_spec" "" { target *-*-* } 0 }
+// Except the check_dynamic_spec<>(0) one for LWG 4142 which matches this:
+// { dg-error "static assertion failed" "" { target *-*-* } 0 }