summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark de Wever <koraq@xs4all.nl>2023-02-06 16:29:30 +0100
committerTom Stellard <tstellar@redhat.com>2023-02-07 18:46:12 -0800
commit22000e3c8d1aa4e1d9530624ecc25f3096434af3 (patch)
treeddc55f2d38a2574438b7bbb895e7d3e0c1c486f5
parentc41085e779b1ffdd343be8dfcc59aaaeef61faec (diff)
downloadllvm-22000e3c8d1aa4e1d9530624ecc25f3096434af3.tar.gz
[libc++][format] Fixes constexpr validation.
The constexpr validation parsed parts of the format string that didn't belong to the specific replacement field. Fixes https://llvm.org/PR60536 Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D143402 (cherry picked from commit ac44dadcbea52e14aab20c0d590d4ec00d615a93)
-rw-r--r--libcxx/include/__format/format_functions.h8
-rw-r--r--libcxx/test/std/utilities/format/format.functions/format_tests.h4
2 files changed, 9 insertions, 3 deletions
diff --git a/libcxx/include/__format/format_functions.h b/libcxx/include/__format/format_functions.h
index 185148ccba53..0f0001272d40 100644
--- a/libcxx/include/__format/format_functions.h
+++ b/libcxx/include/__format/format_functions.h
@@ -258,10 +258,12 @@ __handle_replacement_field(const _CharT* __begin, const _CharT* __end,
if constexpr (same_as<_Ctx, __compile_time_basic_format_context<_CharT>>) {
__arg_t __type = __ctx.arg(__r.__value);
- if (__type == __arg_t::__handle)
+ if (__type == __arg_t::__none)
+ std::__throw_format_error("Argument index out of bounds");
+ else if (__type == __arg_t::__handle)
__ctx.__handle(__r.__value).__parse(__parse_ctx);
- else
- __format::__compile_time_visit_format_arg(__parse_ctx, __ctx, __type);
+ else if (__parse)
+ __format::__compile_time_visit_format_arg(__parse_ctx, __ctx, __type);
} else
_VSTD::__visit_format_arg(
[&](auto __arg) {
diff --git a/libcxx/test/std/utilities/format/format.functions/format_tests.h b/libcxx/test/std/utilities/format/format.functions/format_tests.h
index 86d11f2c26be..763cf4517bff 100644
--- a/libcxx/test/std/utilities/format/format.functions/format_tests.h
+++ b/libcxx/test/std/utilities/format/format.functions/format_tests.h
@@ -2617,6 +2617,10 @@ void format_tests(TestFunction check, ExceptionTest check_exception) {
check(SV("{"), SV("{{"));
check(SV("}"), SV("}}"));
+ check(SV("{:^}"), SV("{{:^}}"));
+ check(SV("{: ^}"), SV("{{:{}^}}"), CharT(' '));
+ check(SV("{:{}^}"), SV("{{:{{}}^}}"));
+ check(SV("{:{ }^}"), SV("{{:{{{}}}^}}"), CharT(' '));
// *** Test argument ID ***
check(SV("hello false true"), SV("hello {0:} {1:}"), false, true);