commit 8b0557b033b9 Author: Dimitry Andric Date: Fri Jan 27 13:55:00 2017 +0100 Bug 1329520 - Fix "memory/mozalloc/throw_gcc.h:35:1: note: declaration missing '[[noreturn]]' (libc++ 4.0)" r=nfroyd --- memory/mozalloc/throw_gcc.h | 47 ++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git memory/mozalloc/throw_gcc.h memory/mozalloc/throw_gcc.h index 18027e04a4a3..4264df63d493 100644 --- memory/mozalloc/throw_gcc.h +++ memory/mozalloc/throw_gcc.h @@ -19,104 +19,117 @@ #include "mozilla/mozalloc_abort.h" +// libc++ 4.0.0 and higher use C++11 [[noreturn]] attributes for the functions +// below, and since clang does not allow mixing __attribute__((noreturn)) and +// [[noreturn]], we have to explicitly use the latter here. See bug 1329520. +#if defined(__clang__) +# if __has_feature(cxx_attributes) && \ + defined(_LIBCPP_VERSION) && _LIBCPP_VERSION >= 4000 +# define MOZ_THROW_NORETURN [[noreturn]] +# endif +#endif +#ifndef MOZ_THROW_NORETURN +# define MOZ_THROW_NORETURN MOZ_NORETURN +#endif + namespace std { // NB: user code is not supposed to touch the std:: namespace. We're // doing this after careful review because we want to define our own // exception throwing semantics. Don't try this at home! -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_bad_exception(void) { mozalloc_abort("fatal: STL threw bad_exception"); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_bad_alloc(void) { mozalloc_abort("fatal: STL threw bad_alloc"); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_bad_cast(void) { mozalloc_abort("fatal: STL threw bad_cast"); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_bad_typeid(void) { mozalloc_abort("fatal: STL threw bad_typeid"); } // used by -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_bad_function_call(void) { mozalloc_abort("fatal: STL threw bad_function_call"); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_logic_error(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_domain_error(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_invalid_argument(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_length_error(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_out_of_range(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_runtime_error(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_range_error(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_overflow_error(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_underflow_error(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_ios_failure(const char* msg) { mozalloc_abort(msg); } -MOZ_EXPORT MOZ_NORETURN MOZ_ALWAYS_INLINE void +MOZ_THROW_NORETURN MOZ_EXPORT MOZ_ALWAYS_INLINE void __throw_system_error(int err) { char error[128]; @@ -127,4 +140,6 @@ __throw_system_error(int err) } // namespace std +#undef MOZ_THROW_NORETURN + #endif // mozilla_throw_gcc_h