1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | /* |
3 | * This file is part of the LibreOffice project. |
4 | * |
5 | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | * |
9 | * This file incorporates work covered by the following license notice: |
10 | * |
11 | * Licensed to the Apache Software Foundation (ASF) under one or more |
12 | * contributor license agreements. See the NOTICE file distributed |
13 | * with this work for additional information regarding copyright |
14 | * ownership. The ASF licenses this file to you under the Apache |
15 | * License, Version 2.0 (the "License"); you may not use this file |
16 | * except in compliance with the License. You may obtain a copy of |
17 | * the License at http://www.apache.org/licenses/LICENSE-2.0 . |
18 | */ |
19 | |
20 | #ifndef _SAL_TYPES_H_ |
21 | #define _SAL_TYPES_H_ |
22 | |
23 | #include <sal/config.h> |
24 | #include <sal/macros.h> |
25 | |
26 | #include <sal/typesizes.h> |
27 | |
28 | #ifdef __cplusplus |
29 | extern "C" { |
30 | #endif |
31 | |
32 | #if defined ( __MINGW32__ ) && !defined ( __USE_MINGW_ANSI_STDIO ) |
33 | /* Define to use the C99 formating string for coherence reasons. |
34 | * In mingw-w64 some functions are ported to the ms formating string |
35 | * some are not yet. This is the only way to make the formatting |
36 | * strings work all the time |
37 | */ |
38 | #define __USE_MINGW_ANSI_STDIO 1 |
39 | #endif |
40 | |
41 | /********************************************************************************/ |
42 | /* Data types |
43 | */ |
44 | |
45 | /* Boolean */ |
46 | typedef unsigned char sal_Bool; |
47 | # define sal_False ((sal_Bool)0) |
48 | # define sal_True ((sal_Bool)1) |
49 | |
50 | /* char is assumed to always be 1 byte long */ |
51 | typedef signed char sal_Int8; |
52 | typedef unsigned char sal_uInt8; |
53 | |
54 | #if SAL_TYPES_SIZEOFSHORT == 2 |
55 | typedef signed short sal_Int16; |
56 | typedef unsigned short sal_uInt16; |
57 | #else |
58 | #error "Could not find 16-bit type, add support for your architecture" |
59 | #endif |
60 | |
61 | #if SAL_TYPES_SIZEOFLONG == 4 |
62 | typedef signed long sal_Int32; |
63 | typedef unsigned long sal_uInt32; |
64 | #define SAL_PRIdINT32 "ld" |
65 | #define SAL_PRIuUINT32 "lu" |
66 | #define SAL_PRIxUINT32 "lx" |
67 | #define SAL_PRIXUINT32 "lX" |
68 | #elif SAL_TYPES_SIZEOFINT == 4 |
69 | typedef signed int sal_Int32; |
70 | typedef unsigned int sal_uInt32; |
71 | #define SAL_PRIdINT32 "d" |
72 | #define SAL_PRIuUINT32 "u" |
73 | #define SAL_PRIxUINT32 "x" |
74 | #define SAL_PRIXUINT32 "X" |
75 | #else |
76 | #error "Could not find 32-bit type, add support for your architecture" |
77 | #endif |
78 | |
79 | #ifdef _MSC_VER |
80 | typedef __int64 sal_Int64; |
81 | typedef unsigned __int64 sal_uInt64; |
82 | |
83 | /* The following are macros that will add the 64 bit constant suffix. */ |
84 | #define SAL_CONST_INT64(x) x##i64 |
85 | #define SAL_CONST_UINT64(x) x##ui64 |
86 | |
87 | #define SAL_PRIdINT64 "I64d" |
88 | #define SAL_PRIuUINT64 "I64u" |
89 | #define SAL_PRIxUINT64 "I64x" |
90 | #define SAL_PRIXUINT64 "I64X" |
91 | #elif defined (__GNUC__) |
92 | #if SAL_TYPES_SIZEOFLONG == 8 |
93 | typedef signed long int sal_Int64; |
94 | typedef unsigned long int sal_uInt64; |
95 | |
96 | |
97 | /* The following are macros that will add the 64 bit constant suffix. */ |
98 | #define SAL_CONST_INT64(x) x##l |
99 | #define SAL_CONST_UINT64(x) x##ul |
100 | |
101 | #define SAL_PRIdINT64 "ld" |
102 | #define SAL_PRIuUINT64 "lu" |
103 | #define SAL_PRIxUINT64 "lx" |
104 | #define SAL_PRIXUINT64 "lX" |
105 | #elif SAL_TYPES_SIZEOFLONGLONG == 8 |
106 | typedef signed long long sal_Int64; |
107 | typedef unsigned long long sal_uInt64; |
108 | |
109 | /* The following are macros that will add the 64 bit constant suffix. */ |
110 | #define SAL_CONST_INT64(x) x##ll |
111 | #define SAL_CONST_UINT64(x) x##ull |
112 | |
113 | #define SAL_PRIdINT64 "lld" |
114 | #define SAL_PRIuUINT64 "llu" |
115 | #define SAL_PRIxUINT64 "llx" |
116 | #define SAL_PRIXUINT64 "llX" |
117 | #else |
118 | #error "Could not find 64-bit type, add support for your architecture" |
119 | #endif |
120 | #else |
121 | #error "Please define the 64-bit types for your architecture/compiler in sal/inc/sal/types.h" |
122 | #endif |
123 | |
124 | /** A legacy synonym for `char`. |
125 | |
126 | @deprecated use plain `char` instead. |
127 | */ |
128 | typedef char sal_Char; |
129 | |
130 | /** A legacy synonym for `signed char`. |
131 | |
132 | @deprecated use plain `signed char` instead. |
133 | */ |
134 | typedef signed char sal_sChar; |
135 | |
136 | /** A legacy synonym for `unsigned char`. |
137 | |
138 | @deprecated use plain `unsigned char` instead. |
139 | */ |
140 | typedef unsigned char sal_uChar; |
141 | |
142 | #if ( defined(SAL_W32) && !defined(__MINGW32__) ) |
143 | // http://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.80%29.aspx |
144 | // "By default wchar_t is a typedef for unsigned short." |
145 | // But MinGW has a native wchar_t, and on many places, we cannot deal with |
146 | // that, so sal_Unicode has to be explicitly typedef'd as sal_uInt16 there. |
147 | typedef wchar_t sal_Unicode; |
148 | #else |
149 | #define SAL_UNICODE_NOTEQUAL_WCHAR_T |
150 | typedef sal_uInt16 sal_Unicode; |
151 | #endif |
152 | |
153 | typedef void * sal_Handle; |
154 | |
155 | /* sal_Size should currently be the native width of the platform */ |
156 | #if SAL_TYPES_SIZEOFPOINTER == 4 |
157 | typedef sal_uInt32 sal_Size; |
158 | typedef sal_Int32 sal_sSize; |
159 | #elif SAL_TYPES_SIZEOFPOINTER == 8 |
160 | typedef sal_uInt64 sal_Size; |
161 | typedef sal_Int64 sal_sSize; |
162 | #else |
163 | #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler" |
164 | #endif |
165 | |
166 | /* sal_PtrDiff holds the result of a pointer subtraction */ |
167 | #if SAL_TYPES_SIZEOFPOINTER == 4 |
168 | typedef sal_Int32 sal_PtrDiff; |
169 | #elif SAL_TYPES_SIZEOFPOINTER == 8 |
170 | typedef sal_Int64 sal_PtrDiff; |
171 | #else |
172 | #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler" |
173 | #endif |
174 | |
175 | /* printf-style conversion specification length modifiers for size_t and |
176 | ptrdiff_t (most platforms support C99, MSC has its own extension) */ |
177 | #if defined(_MSC_VER) |
178 | #define SAL_PRI_SIZET "I" |
179 | #define SAL_PRI_PTRDIFFT "I" |
180 | #else |
181 | #define SAL_PRI_SIZET "z" |
182 | #define SAL_PRI_PTRDIFFT "t" |
183 | #endif |
184 | |
185 | /* sal_IntPtr, sal_uIntPtr are integer types designed to hold pointers so that any valid |
186 | * pointer to void can be converted to this type and back to a pointer to void and the |
187 | * result will compare to the original pointer */ |
188 | #if SAL_TYPES_SIZEOFPOINTER == 4 |
189 | typedef sal_Int32 sal_IntPtr; |
190 | typedef sal_uInt32 sal_uIntPtr; |
191 | #define SAL_PRIdINTPTR SAL_PRIdINT32 |
192 | #define SAL_PRIuUINTPTR SAL_PRIuUINT32 |
193 | #define SAL_PRIxUINTPTR SAL_PRIxUINT32 |
194 | #define SAL_PRIXUINTPTR SAL_PRIXUINT32 |
195 | #elif SAL_TYPES_SIZEOFPOINTER == 8 |
196 | typedef sal_Int64 sal_IntPtr; |
197 | typedef sal_uInt64 sal_uIntPtr; |
198 | #define SAL_PRIdINTPTR SAL_PRIdINT64 |
199 | #define SAL_PRIuUINTPTR SAL_PRIuUINT64 |
200 | #define SAL_PRIxUINTPTR SAL_PRIxUINT64 |
201 | #define SAL_PRIXUINTPTR SAL_PRIXUINT64 |
202 | #else |
203 | #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler" |
204 | #endif |
205 | |
206 | /********************************************************************************/ |
207 | /* Useful defines |
208 | */ |
209 | |
210 | /* The following SAL_MIN_INTn defines codify the assumption that the signed |
211 | * sal_Int types use two's complement representation. Defining them as |
212 | * "-0x7F... - 1" instead of as "-0x80..." prevents warnings about applying the |
213 | * unary minus operator to unsigned quantities. |
214 | */ |
215 | #define SAL_MIN_INT8 ((sal_Int8) (-0x7F - 1)) |
216 | #define SAL_MAX_INT8 ((sal_Int8) 0x7F) |
217 | #define SAL_MAX_UINT8 ((sal_uInt8) 0xFF) |
218 | #define SAL_MIN_INT16 ((sal_Int16) (-0x7FFF - 1)) |
219 | #define SAL_MAX_INT16 ((sal_Int16) 0x7FFF) |
220 | #define SAL_MAX_UINT16 ((sal_uInt16) 0xFFFF) |
221 | #define SAL_MIN_INT32 ((sal_Int32) (-0x7FFFFFFF - 1)) |
222 | #define SAL_MAX_INT32 ((sal_Int32) 0x7FFFFFFF) |
223 | #define SAL_MAX_UINT32 ((sal_uInt32) 0xFFFFFFFF) |
224 | #define SAL_MIN_INT64 ((sal_Int64) (SAL_CONST_INT64(-0x7FFFFFFFFFFFFFFF) - 1)) |
225 | #define SAL_MAX_INT64 ((sal_Int64) SAL_CONST_INT64(0x7FFFFFFFFFFFFFFF)) |
226 | #define SAL_MAX_UINT64 ((sal_uInt64) SAL_CONST_UINT64(0xFFFFFFFFFFFFFFFF)) |
227 | |
228 | #if SAL_TYPES_SIZEOFLONG == 4 |
229 | #define SAL_MAX_SSIZE SAL_MAX_INT32 |
230 | #define SAL_MAX_SIZE SAL_MAX_UINT32 |
231 | #elif SAL_TYPES_SIZEOFLONG == 8 |
232 | #define SAL_MAX_SSIZE SAL_MAX_INT64 |
233 | #define SAL_MAX_SIZE SAL_MAX_UINT64 |
234 | #endif |
235 | |
236 | #if defined(SAL_W32) || defined(SAL_UNX) |
237 | # define SAL_MAX_ENUM 0x7fffffff |
238 | #endif |
239 | |
240 | #if defined(_MSC_VER) || defined(__MINGW32__) |
241 | # define SAL_DLLPUBLIC_EXPORT __declspec(dllexport) |
242 | # define SAL_JNI_EXPORT __declspec(dllexport) |
243 | #if defined(_MSC_VER) |
244 | # define SAL_DLLPUBLIC_IMPORT __declspec(dllimport) |
245 | #else |
246 | # define SAL_DLLPUBLIC_IMPORT |
247 | #endif // defined(_MSC_VER) |
248 | # define SAL_DLLPRIVATE |
249 | # define SAL_DLLPUBLIC_TEMPLATE |
250 | # define SAL_CALL __cdecl |
251 | # define SAL_CALL_ELLIPSE __cdecl |
252 | #elif defined SAL_UNX |
253 | # if defined(__GNUC__) && defined(HAVE_GCC_VISIBILITY_FEATURE) |
254 | # if defined(DISABLE_DYNLOADING) |
255 | # define SAL_DLLPUBLIC_EXPORT __attribute__ ((visibility("hidden"))) |
256 | # define SAL_JNI_EXPORT __attribute__ ((visibility("default"))) |
257 | # define SAL_DLLPUBLIC_IMPORT __attribute__ ((visibility("hidden"))) |
258 | # define SAL_DLLPRIVATE __attribute__ ((visibility("hidden"))) |
259 | # define SAL_DLLPUBLIC_TEMPLATE __attribute__ ((visibility("hidden"))) |
260 | # else |
261 | # define SAL_DLLPUBLIC_EXPORT __attribute__ ((visibility("default"))) |
262 | # define SAL_JNI_EXPORT __attribute__ ((visibility("default"))) |
263 | # define SAL_DLLPUBLIC_IMPORT __attribute__ ((visibility("default"))) |
264 | # define SAL_DLLPRIVATE __attribute__ ((visibility("hidden"))) |
265 | # define SAL_DLLPUBLIC_TEMPLATE __attribute__ ((visibility("default"))) |
266 | # endif |
267 | # else |
268 | # define SAL_DLLPUBLIC_EXPORT |
269 | # define SAL_JNI_EXPORT |
270 | # define SAL_DLLPUBLIC_IMPORT |
271 | # define SAL_DLLPRIVATE |
272 | # define SAL_DLLPUBLIC_TEMPLATE |
273 | # endif |
274 | # define SAL_CALL |
275 | # define SAL_CALL_ELLIPSE |
276 | #else |
277 | # error("unknown platform") |
278 | #endif |
279 | |
280 | /** |
281 | Exporting the symbols necessary for exception handling on GCC. |
282 | |
283 | These macros are used for inline declarations of exception classes, as in |
284 | rtl/malformeduriexception.hxx. |
285 | */ |
286 | #if defined(__GNUC__) && ! defined(__MINGW32__) |
287 | # if defined(DISABLE_DYNLOADING) |
288 | # define SAL_EXCEPTION_DLLPUBLIC_EXPORT __attribute__((visibility("default"))) |
289 | # else |
290 | # define SAL_EXCEPTION_DLLPUBLIC_EXPORT SAL_DLLPUBLIC_EXPORT |
291 | # endif |
292 | # define SAL_EXCEPTION_DLLPRIVATE SAL_DLLPRIVATE |
293 | #else |
294 | # define SAL_EXCEPTION_DLLPUBLIC_EXPORT |
295 | # define SAL_EXCEPTION_DLLPRIVATE |
296 | #endif |
297 | |
298 | /** Use this as markup for functions and methods whose return value must be |
299 | checked. |
300 | |
301 | Compilers that support a construct of this nature will emit a compile |
302 | time warning on unchecked return value. |
303 | */ |
304 | #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) |
305 | # define SAL_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) |
306 | #else |
307 | # define SAL_WARN_UNUSED_RESULT |
308 | #endif |
309 | |
310 | /** Use this for pure virtual classes, e.g. class SAL_NO_VTABLE Foo { ... |
311 | This hinders the compiler from setting a generic vtable stating that |
312 | a pure virtual function was called and thus slightly reduces code size. |
313 | */ |
314 | #ifdef _MSC_VER |
315 | # define SAL_NO_VTABLE __declspec(novtable) |
316 | #else |
317 | # define SAL_NO_VTABLE |
318 | #endif |
319 | |
320 | #ifdef SAL_W32 |
321 | # pragma pack(push, 8) |
322 | #endif |
323 | |
324 | /** This is the binary specification of a SAL sequence. |
325 | <br> |
326 | */ |
327 | typedef struct _sal_Sequence |
328 | { |
329 | /** reference count of sequence<br> |
330 | */ |
331 | sal_Int32 nRefCount; |
332 | /** element count<br> |
333 | */ |
334 | sal_Int32 nElements; |
335 | /** elements array<br> |
336 | */ |
337 | char elements[1]; |
338 | } sal_Sequence; |
339 | |
340 | #define SAL_SEQUENCE_HEADER_SIZE ((sal_Size)&((sal_Sequence *)0)->elements) |
341 | |
342 | #if defined( SAL_W32) |
343 | #pragma pack(pop) |
344 | #endif |
345 | |
346 | #if defined __cplusplus |
347 | |
348 | /** Exception specification documentation. |
349 | |
350 | The original intent of this macro was to control whether or not actual |
351 | exception specifications are emitted, based on how much they impact code |
352 | size etc. in a specific scenario. But it ended up always being disabled |
353 | (except for MSVC, which effectively ignored it even though being enabled), |
354 | and used in ways that would make enabling it illegal (e.g., in the |
355 | cppu::ComponentFactoryFunc typedef, or with necessarily incomplete |
356 | com::sun::star::uno::RuntimeException in com/sun/star/uno/Reference.h), so |
357 | has officially been demoted to pure documentation now. |
358 | |
359 | @deprecated do not use in new code. |
360 | */ |
361 | #define SAL_THROW(x) |
362 | |
363 | /** Nothrow specification for C functions. |
364 | |
365 | This is a macro so it can expand to nothing in C code. |
366 | */ |
367 | #define SAL_THROW_EXTERN_C() throw () |
368 | |
369 | #else |
370 | |
371 | /* SAL_THROW() must not be used in C code, only SAL_THROW_EXTERN_C() is defined |
372 | there: |
373 | */ |
374 | #define SAL_THROW_EXTERN_C() |
375 | |
376 | #endif |
377 | |
378 | #ifdef __cplusplus |
379 | } |
380 | #endif /* __cplusplus */ |
381 | |
382 | #ifdef __cplusplus |
383 | |
384 | enum __sal_NoAcquire |
385 | { |
386 | /** definition of a no acquire enum for ctors |
387 | */ |
388 | SAL_NO_ACQUIRE |
389 | }; |
390 | |
391 | namespace com { namespace sun { namespace star { } } } |
392 | |
393 | /** short-circuit extra-verbose API namespaces |
394 | |
395 | @since LibreOffice 4.0 |
396 | */ |
397 | namespace css = ::com::sun::star; |
398 | |
399 | /** C++11 "= delete" feature. |
400 | |
401 | With HAVE_CXX11_DELETE, calling a deleted function will cause a compile-time |
402 | error, while otherwise it will only cause a link-time error as the declared |
403 | function is not defined. |
404 | |
405 | @since LibreOffice 4.1 |
406 | */ |
407 | #if HAVE_CXX11_DELETE |
408 | #define SAL_DELETED_FUNCTION = delete |
409 | #else |
410 | #define SAL_DELETED_FUNCTION |
411 | #endif |
412 | |
413 | /** C++11 "override" feature. |
414 | |
415 | With HAVE_CXX11_OVERRIDE, force the method to override a existing method in |
416 | parent, error out if the method with the correct signature does not exist. |
417 | |
418 | @since LibreOffice 4.1 |
419 | */ |
420 | #if HAVE_CXX11_OVERRIDE |
421 | #define SAL_OVERRIDE override |
422 | #else |
423 | #define SAL_OVERRIDE |
424 | #endif |
425 | |
426 | /** C++11 "final" feature. |
427 | |
428 | With HAVE_CXX11_FINAL, mark a class as non-derivable or a method as non-overridable. |
429 | |
430 | @since LibreOffice 4.1 |
431 | */ |
432 | #if HAVE_CXX11_FINAL |
433 | #define SAL_FINAL final |
434 | #else |
435 | #define SAL_FINAL |
436 | #endif |
437 | |
438 | #endif /* __cplusplus */ |
439 | |
440 | #ifdef __cplusplus |
441 | |
442 | namespace sal { |
443 | |
444 | /** |
445 | A static_cast between integral types, to avoid C++ compiler warnings. |
446 | |
447 | In C++ source code, use sal::static_int_cast<T>(n) instead of |
448 | static_cast<T>(n) whenever a compiler warning about integral type problems |
449 | shall be silenced. That way, source code that needs to be modified when the |
450 | type of any of the expressions involved in the compiler warning is changed |
451 | can be found more easily. |
452 | |
453 | Both template arguments T1 and T2 must be integral types. |
454 | */ |
455 | template< typename T1, typename T2 > inline T1 static_int_cast(T2 n) { |
456 | return static_cast< T1 >(n); |
457 | } |
458 | |
459 | } |
460 | |
461 | #else /* __cplusplus */ |
462 | |
463 | /** |
464 | A cast between integer types, to avoid C compiler warnings. |
465 | |
466 | In C source code, use SAL_INT_CAST(type, expr) instead of ((type) (expr)) |
467 | whenever a compiler warning about integer type problems shall be silenced. |
468 | That way, source code that needs to be modified when the type of any of the |
469 | expressions involved in the compiler warning is changed can be found more |
470 | easily. |
471 | |
472 | The argument 'type' must be an integer type and the argument 'expr' must be |
473 | an integer expression. Both arguments are evaluated exactly once. |
474 | */ |
475 | #define SAL_INT_CAST(type, expr) ((type) (expr)) |
476 | |
477 | #endif /* __cplusplus */ |
478 | |
479 | /** |
480 | Use as follows: |
481 | SAL_DEPRECATED("Dont use, its evil.") void doit(int nPara); |
482 | */ |
483 | |
484 | #if HAVE_GCC_DEPRECATED_MESSAGE |
485 | # define SAL_DEPRECATED(message) __attribute__((deprecated(message))) |
486 | #elif (__GNUC__) |
487 | # define SAL_DEPRECATED(message) __attribute__((deprecated)) |
488 | #elif defined(_MSC_VER) |
489 | # define SAL_DEPRECATED(message) __declspec(deprecated(message)) |
490 | #else |
491 | # define SAL_DEPRECATED(message) |
492 | #endif |
493 | |
494 | /** |
495 | This macro is used to tag interfaces that are deprecated for both |
496 | internal and external API users, but where we are still writing |
497 | out the internal usage. Ultimately these should be replaced by |
498 | SAL_DEPRECATED, and then removed. |
499 | |
500 | Use as follows: |
501 | SAL_DEPRECATED_INTERNAL("Dont use, its evil.") void doit(int nPara); |
502 | */ |
503 | #ifdef LIBO_INTERNAL_ONLY |
504 | # define SAL_DEPRECATED_INTERNAL(message) |
505 | #else |
506 | # define SAL_DEPRECATED_INTERNAL(message) SAL_DEPRECATED(message) |
507 | #endif |
508 | |
509 | /** |
510 | Use as follows: |
511 | SAL_WNODEPRECATED_DECLARATIONS_PUSH |
512 | \::std::auto_ptr<X> ... |
513 | SAL_WNODEPRECATED_DECLARATIONS_POP |
514 | */ |
515 | |
516 | #if HAVE_GCC_PRAGMA_DIAGNOSTIC_MODIFY && HAVE_GCC_PRAGMA_DIAGNOSTIC_SCOPE && HAVE_GCC_PRAGMA_OPERATOR |
517 | #define SAL_WNODEPRECATED_DECLARATIONS_PUSH \ |
518 | _Pragma(SAL_STRINGIFY_ARG(GCC diagnostic push)) \ |
519 | _Pragma(SAL_STRINGIFY_ARG(GCC diagnostic ignored "-Wdeprecated-declarations")) |
520 | #define SAL_WNODEPRECATED_DECLARATIONS_POP \ |
521 | _Pragma(SAL_STRINGIFY_ARG(GCC diagnostic pop)) |
522 | #else |
523 | # define SAL_WNODEPRECATED_DECLARATIONS_PUSH |
524 | # define SAL_WNODEPRECATED_DECLARATIONS_POP |
525 | #endif |
526 | |
527 | /** |
528 | Use as follows: |
529 | |
530 | SAL_WNOUNREACHABLE_CODE_PUSH |
531 | |
532 | function definition |
533 | |
534 | SAL_WNOUNREACHABLE_CODE_POP |
535 | |
536 | Useful in cases where the compiler is "too clever" like when doing |
537 | link-time code generation, and noticing that a called function |
538 | always throws, and fixing the problem cleanly so that it produceds |
539 | no warnings in normal non-LTO compilations either is not easy. |
540 | |
541 | */ |
542 | |
543 | #ifdef _MSC_VER |
544 | #define SAL_WNOUNREACHABLE_CODE_PUSH \ |
545 | __pragma(warning(push)) \ |
546 | __pragma(warning(disable:4702)) |
547 | #define SAL_WNOUNREACHABLE_CODE_POP \ |
548 | __pragma(warning(pop)) |
549 | #else |
550 | /* Add definitions for GCC and Clang if needed */ |
551 | #define SAL_WNOUNREACHABLE_CODE_PUSH |
552 | #define SAL_WNOUNREACHABLE_CODE_POP |
553 | #endif |
554 | |
555 | /** Annotate unused but required C++ function parameters. |
556 | |
557 | An unused parameter is required if the function needs to adhere to a given |
558 | type (e.g., if its address is assigned to a function pointer of a specific |
559 | type, or if it is called from template code). This annotation helps static |
560 | analysis tools suppress false warnings. In the case of virtual functions |
561 | (where unused required parameters are common, too), the annotation is not |
562 | required (as static analysis tools can themselves derive the information |
563 | whether a function is virtual). |
564 | |
565 | Use the annotation in function definitions like |
566 | |
567 | void f(SAL_UNUSED_PARAMETER int) {} |
568 | |
569 | C does not allow unnamed parameters, anyway, so a function definition like |
570 | the above needs to be written there as |
571 | |
572 | void f(int dummy) { (void) dummy; / * avoid warnings * / } |
573 | |
574 | without a SAL_UNUSED_PARAMETER annotation. |
575 | |
576 | @since LibreOffice 3.6 |
577 | */ |
578 | #if defined __cplusplus |
579 | #if defined __GNUC__ |
580 | #define SAL_UNUSED_PARAMETER __attribute__ ((unused)) |
581 | #else |
582 | #define SAL_UNUSED_PARAMETER |
583 | #endif |
584 | #endif |
585 | |
586 | /** |
587 | |
588 | Annotate classes where a compiler should warn if an instance is unused. |
589 | |
590 | The compiler cannot warn about unused instances if they have non-trivial |
591 | or external constructors or destructors. Classes marked with SAL_WARN_UNUSED |
592 | will be warned about. |
593 | |
594 | @since LibreOffice 4.0 |
595 | |
596 | */ |
597 | |
598 | #if HAVE_GCC_ATTRIBUTE_WARN_UNUSED |
599 | #define SAL_WARN_UNUSED __attribute__((warn_unused)) |
600 | #elif defined __clang__ |
601 | #define SAL_WARN_UNUSED __attribute__((annotate("lo_warn_unused"))) |
602 | #else |
603 | #define SAL_WARN_UNUSED |
604 | #endif |
605 | |
606 | #endif /*_SAL_TYPES_H_ */ |
607 | |
608 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |
609 | |