summaryrefslogtreecommitdiff
path: root/www/libxul/files/patch-bug1329520
blob: 694b658caa692b7d29494daf8ab2d9eacee95f87 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
commit 8b0557b033b9
Author: Dimitry Andric <dimitry>
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,97 +19,110 @@
 
 #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_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_bad_exception(void)
 {
     mozalloc_abort("fatal: STL threw bad_exception");
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_bad_alloc(void)
 {
     mozalloc_abort("fatal: STL threw bad_alloc");
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_bad_cast(void)
 {
     mozalloc_abort("fatal: STL threw bad_cast");
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_bad_typeid(void)
 {
     mozalloc_abort("fatal: STL threw bad_typeid");
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_logic_error(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_domain_error(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_invalid_argument(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_length_error(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_out_of_range(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_runtime_error(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_range_error(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_overflow_error(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_underflow_error(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_ios_failure(const char* msg)
 {
     mozalloc_abort(msg);
 }
 
-MOZ_NORETURN MOZ_ALWAYS_INLINE void
+MOZ_THROW_NORETURN MOZ_ALWAYS_INLINE void
 __throw_system_error(int err)
 {
     char error[128];
@@ -120,4 +133,6 @@ __throw_system_error(int err)
 
 } // namespace std
 
+#undef MOZ_THROW_NORETURN
+
 #endif  // mozilla_throw_gcc_h