mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 20:15:17 +00:00
AK: Fix build with Clang>=12
Build failure as in https://oss-fuzz-build-logs.storage.googleapis.com/log-79750138-f41e-4f39-8812-7c536f1d2e35.txt Clang does not appear to like using consteval functions' arguments as constant expressions, so move all the arguments that need to appear as constant expressions into the template parameters for now. This patch should fix the OSS-Fuzz build.
This commit is contained in:
parent
1fd349b8c2
commit
338bb73289
Notes:
sideshowbarker
2024-07-18 22:27:40 +09:00
Author: https://github.com/alimpfard Commit: https://github.com/SerenityOS/serenity/commit/338bb732898 Pull-request: https://github.com/SerenityOS/serenity/pull/5281
1 changed files with 11 additions and 11 deletions
22
AK/Format.h
22
AK/Format.h
|
@ -38,7 +38,7 @@
|
|||
#endif
|
||||
|
||||
#ifndef DBGLN_NO_COMPILETIME_FORMAT_CHECK
|
||||
// Note: Clang 12 adds support for CTAD, this would fail with any version prior to that.
|
||||
// Note: Clang 12 adds support for CTAD on NTTPs, this would fail with any version prior to that.
|
||||
# if defined(__clang__) && __clang_major__ < 12
|
||||
# define DBGLN_NO_COMPILETIME_FORMAT_CHECK
|
||||
# endif
|
||||
|
@ -47,15 +47,15 @@
|
|||
#ifndef DBGLN_NO_COMPILETIME_FORMAT_CHECK
|
||||
namespace {
|
||||
|
||||
template<size_t N>
|
||||
consteval auto extract_used_argument_index(const char (&fmt)[N], size_t specifier_start_index, size_t specifier_end_index, size_t& next_implicit_argument_index)
|
||||
template<size_t N, StringLiteral<N> fmt>
|
||||
consteval auto extract_used_argument_index(size_t specifier_start_index, size_t specifier_end_index, size_t& next_implicit_argument_index)
|
||||
{
|
||||
struct {
|
||||
size_t index_value { 0 };
|
||||
bool saw_explicit_index { false };
|
||||
} state;
|
||||
for (size_t i = specifier_start_index; i < specifier_end_index; ++i) {
|
||||
auto c = fmt[i];
|
||||
auto c = fmt.data[i];
|
||||
if (c > '9' || c < '0')
|
||||
break;
|
||||
|
||||
|
@ -71,8 +71,8 @@ consteval auto extract_used_argument_index(const char (&fmt)[N], size_t specifie
|
|||
}
|
||||
|
||||
// FIXME: We should rather parse these format strings at compile-time if possible.
|
||||
template<size_t N>
|
||||
consteval auto count_fmt_params(const char (&fmt)[N])
|
||||
template<size_t N, StringLiteral<N> fmt>
|
||||
consteval auto count_fmt_params()
|
||||
{
|
||||
struct {
|
||||
// FIXME: Switch to variable-sized storage whenever we can come up with one :)
|
||||
|
@ -91,10 +91,10 @@ consteval auto count_fmt_params(const char (&fmt)[N])
|
|||
} result;
|
||||
|
||||
for (size_t i = 0; i < N; ++i) {
|
||||
auto ch = fmt[i];
|
||||
auto ch = fmt.data[i];
|
||||
switch (ch) {
|
||||
case '{':
|
||||
if (i + 1 < N && fmt[i + 1] == '{') {
|
||||
if (i + 1 < N && fmt.data[i + 1] == '{') {
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
|
@ -108,7 +108,7 @@ consteval auto count_fmt_params(const char (&fmt)[N])
|
|||
++result.unclosed_braces;
|
||||
break;
|
||||
case '}':
|
||||
if (i + 1 < N && fmt[i + 1] == '}') {
|
||||
if (i + 1 < N && fmt.data[i + 1] == '}') {
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ consteval auto count_fmt_params(const char (&fmt)[N])
|
|||
if (result.total_used_argument_count >= result.used_arguments.size())
|
||||
result.internal_error = "Format-String Checker internal error: Too many format arguments in format string";
|
||||
|
||||
auto used_argument_index = extract_used_argument_index<N>(fmt, specifier_start_index, i, result.next_implicit_argument_index);
|
||||
auto used_argument_index = extract_used_argument_index<N, fmt>(specifier_start_index, i, result.next_implicit_argument_index);
|
||||
if (used_argument_index + 1 != result.next_implicit_argument_index)
|
||||
result.has_explicit_argument_references = true;
|
||||
result.used_arguments[result.total_used_argument_count++] = used_argument_index;
|
||||
|
@ -140,7 +140,7 @@ consteval auto count_fmt_params(const char (&fmt)[N])
|
|||
}
|
||||
}
|
||||
|
||||
template<size_t N, StringLiteral<N> fmt, size_t param_count, auto check = count_fmt_params<N>(fmt.data)>
|
||||
template<size_t N, StringLiteral<N> fmt, size_t param_count, auto check = count_fmt_params<N, fmt>()>
|
||||
constexpr bool check_format_parameter_consistency()
|
||||
{
|
||||
static_assert(check.internal_error.data[0] == 0, "Some internal error occured, try looking at the check function type for the error");
|
||||
|
|
Loading…
Add table
Reference in a new issue