fmtlib / fmt

A modern formatting library
https://fmt.dev
Other
19.9k stars 2.43k forks source link

Fix: enable `FMT_NORETURN` without exception support too #3917

Closed eepp closed 3 months ago

eepp commented 3 months ago

When building format.cc as such with GCC 13.2.1:

$ g++ -c format.cc -DFMT_EXCEPTIONS=0 -Wmissing-noreturn -Werror

I get:

In file included from format.cc:8:
fmt/format-inl.h: In function ‘void fmt::v10::detail::assert_fail(const char*, int, const char*)’:
fmt/format-inl.h:30:15: error: function might be candidate for attribute ‘noreturn’ [-Werror=suggest-attribute=noreturn]
   30 | FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
      |               ^~~~~~~~~~~
fmt/format-inl.h: In function ‘void fmt::v10::report_error(const char*)’:
fmt/format-inl.h:129:15: error: function might be candidate for attribute ‘noreturn’ [-Werror=suggest-attribute=noreturn]
  129 | FMT_FUNC void report_error(const char* message) {
      |               ^~~~~~~~~~~~
cc1plus: all warnings being treated as errors

Note that, with FMT_EXCEPTIONS defined to 0:

Therefore, with FMT_EXCEPTIONS defined to 0, both assert_fail() and report_error() need to have the [[noreturn]] attribute too (if available). In other words, FMT_NORETURN doesn't depend on FMT_EXCEPTIONS.

Also adding FMT_NORETURN to two on_error() functions which call report_error(const char *).

Other report_error() overloads eventually return, therefore they don't need FMT_NORETURN.

vitaut commented 3 months ago

Merged, thanks.