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:
report_error(const char *) uses FMT_THROW() which expands to calling assert_fail().
assert_fail() calls std::terminate() which has the [[noreturn]] attribute since C++11.
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.
When building
format.cc
as such with GCC 13.2.1:I get:
Note that, with
FMT_EXCEPTIONS
defined to 0:report_error(const char *)
usesFMT_THROW()
which expands to callingassert_fail()
.assert_fail()
callsstd::terminate()
which has the[[noreturn]]
attribute since C++11.Therefore, with
FMT_EXCEPTIONS
defined to 0, bothassert_fail()
andreport_error()
need to have the[[noreturn]]
attribute too (if available). In other words,FMT_NORETURN
doesn't depend onFMT_EXCEPTIONS
.Also adding
FMT_NORETURN
to twoon_error()
functions which callreport_error(const char *)
.Other
report_error()
overloads eventually return, therefore they don't needFMT_NORETURN
.