xref: /aosp_15_r20/external/lzma/CPP/Common/Common0.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1 // Common0.h
2 
3 #if defined(_MSC_VER) && _MSC_VER >= 1800
4 #pragma warning(disable : 4464) // relative include path contains '..'
5 #endif
6 
7 #ifndef ZIP7_INC_COMMON0_H
8 #define ZIP7_INC_COMMON0_H
9 
10 #include "../../C/Compiler.h"
11 
12 /*
13 This file contains compiler related things for cpp files.
14 This file is included to all cpp files in 7-Zip via "Common.h".
15 Also this file is included in "IDecl.h" (that is included in interface files).
16 So external modules can use 7-Zip interfaces without
17 predefined macros defined in "Common.h".
18 */
19 
20 #ifdef _MSC_VER
21   #pragma warning(disable : 4710) // function not inlined
22   // 'CUncopyable::CUncopyable':
23   #pragma warning(disable : 4514) // unreferenced inline function has been removed
24   #if _MSC_VER < 1300
25     #pragma warning(disable : 4702) // unreachable code
26     #pragma warning(disable : 4714) // function marked as __forceinline not inlined
27     #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information
28   #endif
29   #if _MSC_VER < 1400
30     #pragma warning(disable : 4511) // copy constructor could not be generated    // #pragma warning(disable : 4512) // assignment operator could not be generated
31     #pragma warning(disable : 4512) // assignment operator could not be generated
32   #endif
33   #if _MSC_VER > 1400 && _MSC_VER <= 1900
34     // #pragma warning(disable : 4996)
35        // strcat: This function or variable may be unsafe
36        // GetVersion was declared deprecated
37   #endif
38 
39 #if _MSC_VER > 1200
40 // -Wall warnings
41 
42 #if _MSC_VER <= 1600
43 #pragma warning(disable : 4917) // 'OLE_HANDLE' : a GUID can only be associated with a class, interface or namespace
44 #endif
45 
46 // #pragma warning(disable : 4061) // enumerator '' in switch of enum '' is not explicitly handled by a case label
47 // #pragma warning(disable : 4266) // no override available for virtual member function from base ''; function is hidden
48 #pragma warning(disable : 4625) // copy constructor was implicitly defined as deleted
49 #pragma warning(disable : 4626) // assignment operator was implicitly defined as deleted
50 #if _MSC_VER >= 1600 && _MSC_VER < 1920
51 #pragma warning(disable : 4571) // Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
52 #endif
53 #if _MSC_VER >= 1600
54 #pragma warning(disable : 4365) // 'initializing' : conversion from 'int' to 'unsigned int', signed / unsigned mismatch
55 #endif
56 #if _MSC_VER < 1800
57 // we disable the warning, if we don't use 'final' in class
58 #pragma warning(disable : 4265) // class has virtual functions, but destructor is not virtual
59 #endif
60 
61 #if _MSC_VER >= 1900
62 #pragma warning(disable : 5026) // move constructor was implicitly defined as deleted
63 #pragma warning(disable : 5027) // move assignment operator was implicitly defined as deleted
64 #endif
65 #if _MSC_VER >= 1912
66 #pragma warning(disable : 5039) // pointer or reference to potentially throwing function passed to 'extern "C"' function under - EHc.Undefined behavior may occur if this function throws an exception.
67 #endif
68 #if _MSC_VER >= 1925
69 // #pragma warning(disable : 5204) // 'ISequentialInStream' : class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be destructed correctly
70 #endif
71 #if _MSC_VER >= 1934
72 // #pragma warning(disable : 5264) // const variable is not used
73 #endif
74 
75 #endif // _MSC_VER > 1200
76 #endif // _MSC_VER
77 
78 
79 #if defined(_MSC_VER) // && !defined(__clang__)
80 #define Z7_DECLSPEC_NOTHROW   __declspec(nothrow)
81 #elif defined(__clang__) || defined(__GNUC__)
82 #define Z7_DECLSPEC_NOTHROW   __attribute__((nothrow))
83 #else
84 #define Z7_DECLSPEC_NOTHROW
85 #endif
86 
87 /*
88 #if defined (_MSC_VER) && _MSC_VER >= 1900 \
89     || defined(__clang__) && __clang_major__ >= 6 \
90     || defined(__GNUC__) && __GNUC__ >= 6
91   #define Z7_noexcept noexcept
92 #else
93   #define Z7_noexcept throw()
94 #endif
95 */
96 
97 
98 #if defined(__clang__)
99 
100 #if /* defined(_WIN32) && */ __clang_major__ >= 16
101 #pragma GCC diagnostic ignored "-Wc++98-compat-pedantic"
102 #endif
103 
104 #if __clang_major__ >= 4 && __clang_major__ < 12 && !defined(_WIN32)
105 /*
106 if compiled with new GCC libstdc++, GCC libstdc++ can use:
107 13.2.0/include/c++/
108     <new> : #define _NEW
109     <stdlib.h> : #define _GLIBCXX_STDLIB_H 1
110 */
111 #pragma GCC diagnostic ignored "-Wreserved-id-macro"
112 #endif
113 
114 // noexcept, final, = delete
115 #pragma GCC diagnostic ignored "-Wc++98-compat"
116 #if __clang_major__ >= 4
117 // throw() dynamic exception specifications are deprecated
118 #pragma GCC diagnostic ignored "-Wdeprecated-dynamic-exception-spec"
119 #endif
120 
121 #if __clang_major__ <= 6 // check it
122 #pragma GCC diagnostic ignored "-Wsign-conversion"
123 #endif
124 
125 #pragma GCC diagnostic ignored "-Wold-style-cast"
126 #pragma GCC diagnostic ignored "-Wglobal-constructors"
127 #pragma GCC diagnostic ignored "-Wexit-time-destructors"
128 
129 #if defined(Z7_LLVM_CLANG_VERSION) && __clang_major__ >= 18 // 18.1.0RC
130 #pragma GCC diagnostic ignored "-Wswitch-default"
131 #endif
132 // #pragma GCC diagnostic ignored "-Wunused-private-field"
133 // #pragma GCC diagnostic ignored "-Wnonportable-system-include-path"
134 // #pragma GCC diagnostic ignored "-Wsuggest-override"
135 // #pragma GCC diagnostic ignored "-Wsign-conversion"
136 // #pragma GCC diagnostic ignored "-Winconsistent-missing-override"
137 // #pragma GCC diagnostic ignored "-Wsuggest-destructor-override"
138 // #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
139 // #pragma GCC diagnostic ignored "-Wdeprecated-copy-with-user-provided-dtor"
140 // #pragma GCC diagnostic ignored "-Wdeprecated-copy-dtor"
141 // #ifndef _WIN32
142 // #pragma GCC diagnostic ignored "-Wweak-vtables"
143 // #endif
144 /*
145 #if   defined(Z7_GCC_VERSION)   && (Z7_GCC_VERSION   >= 40400) \
146    || defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30000)
147 // enumeration values not explicitly handled in switch
148 #pragma GCC diagnostic ignored "-Wswitch-enum"
149 #endif
150 */
151 #endif // __clang__
152 
153 
154 #ifdef __GNUC__
155 // #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
156 #endif
157 
158 
159 /* There is BUG in MSVC 6.0 compiler for operator new[]:
160    It doesn't check overflow, when it calculates size in bytes for allocated array.
161    So we can use Z7_ARRAY_NEW macro instead of new[] operator. */
162 
163 #if defined(_MSC_VER) && (_MSC_VER == 1200) && !defined(_WIN64)
164   #define Z7_ARRAY_NEW(p, T, size)  p = new T[((size) > 0xFFFFFFFFu / sizeof(T)) ? 0xFFFFFFFFu / sizeof(T) : (size)];
165 #else
166   #define Z7_ARRAY_NEW(p, T, size)  p = new T[size];
167 #endif
168 
169 #if (defined(__GNUC__) && (__GNUC__ >= 8))
170   #define Z7_ATTR_NORETURN  __attribute__((noreturn))
171 #elif (defined(__clang__) && (__clang_major__ >= 3))
172   #if __has_feature(cxx_attributes)
173     #define Z7_ATTR_NORETURN  [[noreturn]]
174   #else
175     #define Z7_ATTR_NORETURN  __attribute__((noreturn))
176   #endif
177 #elif (defined(_MSC_VER) && (_MSC_VER >= 1900))
178   #define Z7_ATTR_NORETURN  [[noreturn]]
179 #else
180   #define Z7_ATTR_NORETURN
181 #endif
182 
183 
184 // final in "GCC 4.7.0"
185 // In C++98 and C++03 code the alternative spelling __final can be used instead (this is a GCC extension.)
186 
187 #if defined (__cplusplus) && __cplusplus >= 201103L \
188     || defined(_MSC_VER) && _MSC_VER >= 1800 \
189     || defined(__clang__) && __clang_major__ >= 4 \
190     /* || defined(__GNUC__) && __GNUC__ >= 9 */
191   #define Z7_final  final
192   #if defined(__clang__) && __cplusplus < 201103L
193     #pragma GCC diagnostic ignored "-Wc++11-extensions"
194   #endif
195 #elif defined (__cplusplus) && __cplusplus >= 199711L \
196     && defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
197   #define Z7_final __final
198 #else
199   #define Z7_final
200   #if defined(__clang__) && __clang_major__ >= 4 \
201      || defined(__GNUC__) && __GNUC__ >= 4
202     #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
203     #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
204   #endif
205 #endif
206 
207 #define Z7_class_final(c)  class c Z7_final
208 
209 
210 #if defined (__cplusplus) && __cplusplus >= 201103L \
211     || (defined(_MSC_VER) && _MSC_VER >= 1800)
212   #define Z7_CPP_IS_SUPPORTED_default
213   #define Z7_eq_delete  = delete
214   // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c) c(const c& k) = default;
215 #else
216   #define Z7_eq_delete
217   // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c)
218 #endif
219 
220 
221 #if defined(__cplusplus) && (__cplusplus >= 201103L) \
222     || defined(_MSC_VER) && (_MSC_VER >= 1400) /* && (_MSC_VER != 1600) */ \
223     || defined(__clang__) && __clang_major__ >= 4
224   #if defined(_MSC_VER) && (_MSC_VER == 1600) /* && (_MSC_VER != 1600) */
225     #pragma warning(disable : 4481) // nonstandard extension used: override specifier 'override'
226     #define Z7_DESTRUCTOR_override
227   #else
228     #define Z7_DESTRUCTOR_override  override
229   #endif
230   #define Z7_override  override
231 #else
232   #define Z7_override
233   #define Z7_DESTRUCTOR_override
234 #endif
235 
236 
237 
238 #define Z7_CLASS_NO_COPY(cls) \
239   private: \
240   cls(const cls &) Z7_eq_delete; \
241   cls &operator=(const cls &) Z7_eq_delete;
242 
243 class CUncopyable
244 {
245 protected:
CUncopyable()246   CUncopyable() {} // allow constructor
247   // ~CUncopyable() {}
248   Z7_CLASS_NO_COPY(CUncopyable)
249 };
250 
251 #define MY_UNCOPYABLE  :private CUncopyable
252 // #define MY_UNCOPYABLE
253 
254 
255 // typedef void (*Z7_void_Function)(void);
256 
257 #if defined(__clang__) || defined(__GNUC__)
258 #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<Z7_void_Function>(e))
259 #else
260 #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<void*>(e))
261 // #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(e)
262 #endif
263 
264 #define Z7_GET_PROC_ADDRESS(func_type, hmodule, func_name)  \
265     Z7_CAST_FUNC(func_type, GetProcAddress(hmodule, func_name))
266 
267 // || defined(__clang__)
268 // || defined(__GNUC__)
269 
270 #if defined(_MSC_VER) && (_MSC_VER >= 1400)
271 #define Z7_DECLSPEC_NOVTABLE __declspec(novtable)
272 #else
273 #define Z7_DECLSPEC_NOVTABLE
274 #endif
275 
276 #ifdef __clang__
277 #define Z7_PURE_INTERFACES_BEGIN \
278 _Pragma("GCC diagnostic push") \
279 _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")
280 _Pragma("GCC diagnostic ignored \"-Wweak-vtables\"")
281 #define Z7_PURE_INTERFACES_END \
282 _Pragma("GCC diagnostic pop")
283 #else
284 #define Z7_PURE_INTERFACES_BEGIN
285 #define Z7_PURE_INTERFACES_END
286 #endif
287 
288 // NewHandler.h and NewHandler.cpp redefine operator new() to throw exceptions, if compiled with old MSVC compilers
289 #include "NewHandler.h"
290 
291 /*
292 // #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
293 #ifndef ARRAY_SIZE
294 #define ARRAY_SIZE(a)  Z7_ARRAY_SIZE(a)
295 #endif
296 */
297 
298 #endif // ZIP7_INC_COMMON0_H
299 
300 
301 
302 // #define Z7_REDEFINE_NULL
303 
304 #if defined(Z7_REDEFINE_NULL) /* && (!defined(__clang__) || defined(_MSC_VER)) */
305 
306 // NULL is defined in <stddef.h>
307 #include <stddef.h>
308 #undef NULL
309 
310 #ifdef __cplusplus
311   #if defined (__cplusplus) && __cplusplus >= 201103L \
312     || (defined(_MSC_VER) && _MSC_VER >= 1800)
313     #define NULL  nullptr
314   #else
315     #define NULL  0
316   #endif
317 #else
318   #define NULL  ((void *)0)
319 #endif
320 
321 #else // Z7_REDEFINE_NULL
322 
323 #if defined(__clang__) && __clang_major__ >= 5
324 #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
325 #endif
326 
327 #endif // Z7_REDEFINE_NULL
328 
329 // for precompiler:
330 // #include "MyWindows.h"
331