Skip to content

Cannot use any formatting when compiling with Clang #3306

@HoussamCzn

Description

@HoussamCzn

Description

Logging using a formatted string does not work under clang.

How to reproduce

OK

#include <spdlog/spdlog.h>

auto main() -> int
{
    spdlog::error("Some error message without arg");
    return 0;
}

Not OK

#include <spdlog/spdlog.h>

auto main() -> int
{
    spdlog::error("Some error message with arg: {}", 1);
    return 0;
}

Expected behaviour

Second example should compile. GCC has no issue with it:

[2025-01-01 12:47:24.988] [error] Some error message without arg: 1

Clang rejects it with this error message:

[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/logger.h:334:9: error: call to consteval function 'fmt::basic_format_string<char, const char *, const char *&, int &>::basic_format_string<FMT_COMPILE_STRING, 0>' is not a constant expression
[build]   334 |         SPDLOG_LOGGER_CATCH(loc)
[build]       |         ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/logger.h:34:46: note: expanded from macro 'SPDLOG_LOGGER_CATCH'
[build]    34 |                 err_handler_(fmt_lib::format(SPDLOG_FMT_STRING("{} [{}({})]"), ex.what(), \
[build]       |                                              ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/common.h:55:46: note: expanded from macro 'SPDLOG_FMT_STRING'
[build]    55 |     #define SPDLOG_FMT_STRING(format_string) FMT_STRING(format_string)
[build]       |                                              ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/format.h:1827:23: note: expanded from macro 'FMT_STRING'
[build]  1827 | #define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::detail::compile_string, )
[build]       |                       ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/format.h:1806:3: note: expanded from macro 'FMT_STRING_IMPL'
[build]  1806 |   [] {                                                                        \
[build]       |   ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/logger.h:80:9: note: in instantiation of function template specialization 'spdlog::logger::log_<int>' requested here
[build]    80 |         log_(loc, lvl, details::to_string_view(fmt), std::forward<Args>(args)...);
[build]       |         ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/logger.h:85:9: note: in instantiation of function template specialization 'spdlog::logger::log<int>' requested here
[build]    85 |         log(source_loc{}, lvl, fmt, std::forward<Args>(args)...);
[build]       |         ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/logger.h:150:9: note: in instantiation of function template specialization 'spdlog::logger::log<int>' requested here
[build]   150 |         log(level::err, fmt, std::forward<Args>(args)...);
[build]       |         ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/spdlog.h:178:27: note: in instantiation of function template specialization 'spdlog::logger::error<int>' requested here
[build]   178 |     default_logger_raw()->error(fmt, std::forward<Args>(args)...);
[build]       |                           ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/source/main.cpp:5:13: note: in instantiation of function template specialization 'spdlog::error<int>' requested here
[build]     5 |     spdlog::error("Some error message with arg: {}", 1);
[build]       |             ^
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/base.h:779:54: note: subexpression not valid in a constant expression
[build]   779 |     format_str_.remove_prefix(detail::to_unsigned(it - begin()));
[build]       |                                                   ~~~^~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/base.h:2761:5: note: in call to 'this->context_.advance_to(&"{} [{}({})]"[1])'
[build]  2761 |     context_.advance_to(begin);
[build]       |     ^~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/base.h:2756:5: note: in call to 'this->on_format_specs(0, &"{} [{}({})]"[1], &"{} [{}({})]"[1])'
[build]  2756 |     on_format_specs(id, begin, begin);  // Call parse() on empty specs.
[build]       |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/base.h:2581:5: note: in call to 'handler.on_replacement_field(0, &"{} [{}({})]"[1])'
[build]  2581 |     handler.on_replacement_field(handler.on_arg_id(), begin);
[build]       |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/base.h:2613:21: note: in call to 'parse_replacement_field<char, fmt::detail::format_string_checker<char, const char *, const char *, int> &>(&"{} [{}({})]"[1], &"{} [{}({})]"[11], checker(s))'
[build]  2613 |         begin = p = parse_replacement_field(p - 1, end, handler);
[build]       |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/base.h:2884:7: note: in call to 'parse_format_string<true, char, fmt::detail::format_string_checker<char, const char *, const char *, int>>({&"{} [{}({})]"[0], 11}, checker(s))'
[build]  2884 |       detail::parse_format_string<true>(str_, checker(s));
[build]       |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/logger.h:334:9: note: in call to 'basic_format_string<FMT_COMPILE_STRING, 0>([] {
[build]     struct FMT_COMPILE_STRING : fmt::detail::compile_string {
[build]         using char_type [[maybe_unused]] = fmt::remove_cvref_t<decltype("{} [{}({})]"[0])>;
[build]     };
[build]     return FMT_COMPILE_STRING();
[build] }())'
[build]   334 |         SPDLOG_LOGGER_CATCH(loc)
[build]       |         ^~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/logger.h:34:46: note: expanded from macro 'SPDLOG_LOGGER_CATCH'
[build]    34 |                 err_handler_(fmt_lib::format(SPDLOG_FMT_STRING("{} [{}({})]"), ex.what(), \
[build]       |                                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/spdlog/common.h:55:46: note: expanded from macro 'SPDLOG_FMT_STRING'
[build]    55 |     #define SPDLOG_FMT_STRING(format_string) FMT_STRING(format_string)
[build]       |                                              ^~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/format.h:1827:23: note: expanded from macro 'FMT_STRING'
[build]  1827 | #define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::detail::compile_string, )
[build]       |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /media/houssam/OS/Users/doria/Documents/Cxx/hsm/build/dev/vcpkg_installed/x64-linux/include/fmt/format.h:1806:3: note: expanded from macro 'FMT_STRING_IMPL'
[build]  1806 |   [] {                                                                        \
[build]       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1807 |     /* Use the hidden visibility as a workaround for a GCC bug (#1973). */    \
[build]       |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1808 |     /* Use a macro-like name to avoid shadowing warnings. */                  \
[build]       |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1809 |     struct FMT_VISIBILITY("hidden") FMT_COMPILE_STRING : base {               \
[build]       |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1810 |       using char_type FMT_MAYBE_UNUSED = fmt::remove_cvref_t<decltype(s[0])>; \
[build]       |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1811 |       FMT_MAYBE_UNUSED FMT_CONSTEXPR explicit                                 \
[build]       |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1812 |       operator fmt::basic_string_view<char_type>() const {                    \
[build]       |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1813 |         return fmt::detail_exported::compile_string_to_view<char_type>(s);    \
[build]       |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1814 |       }                                                                       \
[build]       |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1815 |     };                                                                        \
[build]       |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1816 |     return FMT_COMPILE_STRING();                                              \
[build]       |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]  1817 |   }()
[build]       |   ~~~
[build] 1 error generated.

Configuration

  • Compiler: clang++20 (20.0.0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions