Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: enable FMT_NORETURN without exception support too #3917

Merged
merged 1 commit into from
Apr 5, 2024

Commits on Apr 4, 2024

  1. Fix: enable FMT_NORETURN without exception support too

    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 <eeppeliteloop@gmail.com>
    eepp committed Apr 4, 2024
    Configuration menu
    Copy the full SHA
    d85e8ee View commit details
    Browse the repository at this point in the history