Bug 1329520 - Fix "memory/mozalloc/throw_gcc.h:35:1: note: declaration missing '[[noreturn]]' (libc++ 4.0)" r=nfroyd a=jcristau
authorDimitry Andric <dimitry>
Fri, 27 Jan 2017 13:55:00 +0100
changeset 358879 c9c4eb9fbaeb
parent 358878 1634b7d9ef87
child 358880 09e755555ba5
push id10668
push usercbook@mozilla.com
push dateThu, 02 Feb 2017 15:29:39 +0000
treeherdermozilla-aurora@cd8688f42f8a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersnfroyd, jcristau
bugs1329520
milestone53.0a2
Bug 1329520 - Fix "memory/mozalloc/throw_gcc.h:35:1: note: declaration missing '[[noreturn]]' (libc++ 4.0)" r=nfroyd a=jcristau
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