Bug 1329520 - Fix "memory/mozalloc/throw_gcc.h:35:1: note: declaration missing '[[noreturn]]' (libc++ 4.0)" r=nfroyd
authorDimitry Andric <dimitry>
Fri, 27 Jan 2017 13:55:00 +0100
changeset 331639 3b96baf833a5
parent 331638 18c7c3e49639
child 331640 167fae6d4d48
push id86317
push usercbook@mozilla.com
push dateMon, 30 Jan 2017 14:03:15 +0000
treeherdermozilla-inbound@c756f91d7c09 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersnfroyd
bugs1329520
milestone54.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1329520 - Fix "memory/mozalloc/throw_gcc.h:35:1: note: declaration missing '[[noreturn]]' (libc++ 4.0)" r=nfroyd
memory/mozalloc/throw_gcc.h
--- a/memory/mozalloc/throw_gcc.h
+++ b/memory/mozalloc/throw_gcc.h
@@ -14,117 +14,132 @@
 #include <string.h>             // strerror
 
 // For gcc, we define these inline to abort so that we're absolutely
 // certain that (i) no exceptions are thrown from Gecko; (ii) these
 // errors are always terminal and caught by breakpad.
 
 #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 <functional>
-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];
     snprintf(error, sizeof(error)-1,
              "fatal: STL threw system_error: %s (%d)", strerror(err), err);
     mozalloc_abort(error);
 }
 
 } // namespace std
 
+#undef MOZ_THROW_NORETURN
+
 #endif  // mozilla_throw_gcc_h