Skip to content

Commit 7d91b64

Browse files
eepphappymonkey1
authored andcommitted
Fix: enable FMT_NORETURN without exception support too (fmtlib#3917)
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: ‣ 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 [1]. 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`. [1]: https://en.cppreference.com/w/cpp/error/terminate Signed-off-by: Philippe Proulx <[email protected]>
1 parent 696804a commit 7d91b64

File tree

2 files changed

+5
-4
lines changed

2 files changed

+5
-4
lines changed

Diff for: include/fmt/base.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,7 @@
175175
#endif
176176

177177
// Disable [[noreturn]] on MSVC/NVCC because of bogus unreachable code warnings.
178-
#if FMT_HAS_CPP_ATTRIBUTE(noreturn) && FMT_EXCEPTIONS && !FMT_MSC_VERSION && \
179-
!defined(__NVCC__)
178+
#if FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VERSION && !defined(__NVCC__)
180179
# define FMT_NORETURN [[noreturn]]
181180
#else
182181
# define FMT_NORETURN
@@ -2754,7 +2753,9 @@ template <typename Char, typename... Args> class format_string_checker {
27542753
return id >= 0 && id < num_args ? parse_funcs_[id](context_) : begin;
27552754
}
27562755

2757-
FMT_CONSTEXPR void on_error(const char* message) { report_error(message); }
2756+
FMT_NORETURN FMT_CONSTEXPR void on_error(const char* message) {
2757+
report_error(message);
2758+
}
27582759
};
27592760

27602761
// A base class for compile-time strings.

Diff for: include/fmt/format.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -4302,7 +4302,7 @@ void vformat_to(buffer<Char>& buf, basic_string_view<Char> fmt,
43024302
return begin;
43034303
}
43044304

4305-
void on_error(const char* message) { report_error(message); }
4305+
FMT_NORETURN void on_error(const char* message) { report_error(message); }
43064306
};
43074307
detail::parse_format_string<false>(fmt, format_handler(out, fmt, args, loc));
43084308
}

0 commit comments

Comments
 (0)