In rL279744, __throw_XXX() functions were introduced, partially for compatibility with software compiled against libstdc++. _LIBCPP_NORETURN is used on all of them, and when C++11 attributes are available, this gets defined as [[noreturn]], instead of the GNU-style __attribute__((noreturn)) style.
However, this can cause trouble with some software, for example Mozilla Firefox, which attempts to redefine several of these __throw_XXX() functions, and but uses the __attribute__((noreturn)) style exclusively. This then leads to errors like:
/usr/include/c++/v1/new:130:1: error: function declared '[[noreturn]]' after its first declaration _LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec ^ /usr/include/c++/v1/__config:283:30: note: expanded from macro '_LIBCPP_NORETURN' # define _LIBCPP_NORETURN [[noreturn]] ^ ../../dist/include/mozilla/throw_gcc.h:35:1: note: declaration missing '[[noreturn]]' attribute is here __throw_bad_alloc(void) ^
See also https://bugs.freebsd.org/216186 and https://bugzilla.mozilla.org/1329520 . In Firefox's case, the following list of functions is affected:
__throw_bad_alloc(void) __throw_bad_cast(void) __throw_bad_exception(void) __throw_bad_function_call(void) __throw_bad_typeid(void) __throw_domain_error(const char*) __throw_invalid_argument(const char*) __throw_ios_failure(const char*) __throw_length_error(const char*) __throw_logic_error(const char*) __throw_out_of_range(const char*) __throw_overflow_error(const char*) __throw_range_error(const char*) __throw_runtime_error(const char*) __throw_system_error(int) __throw_underflow_error(const char*)
To make it easier on third-party software, let's define a LIBCPP_NORETURN_GNU variant, which always uses the __attribute__((noreturn)) style, and apply it specifically to the above list of functions.
This should also be merged to the 4.0 branch, when it has been committed.