ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenlib / BLI_compiler_attrs.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2013 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #ifndef __BLI_COMPILER_ATTRS_H__
21 #define __BLI_COMPILER_ATTRS_H__
22
23 /** \file
24  * \ingroup bli
25  */
26
27 /* hint to make sure function result is actually used */
28 #ifdef __GNUC__
29 #  define ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
30 #else
31 #  define ATTR_WARN_UNUSED_RESULT
32 #endif
33
34 /* hint to mark function arguments expected to be non-null
35  * if no arguments are given to the macro, all of pointer
36  * arguments would be expected to be non-null
37  */
38 #ifdef __GNUC__
39 #  define ATTR_NONNULL(args...) __attribute__((nonnull(args)))
40 #else
41 #  define ATTR_NONNULL(...)
42 #endif
43
44 /* never returns NULL */
45 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 /* gcc4.9+ only */
46 #  define ATTR_RETURNS_NONNULL __attribute__((returns_nonnull))
47 #else
48 #  define ATTR_RETURNS_NONNULL
49 #endif
50
51 /* hint to mark function as it wouldn't return */
52 #if defined(__GNUC__) || defined(__clang__)
53 #  define ATTR_NORETURN __attribute__((noreturn))
54 #else
55 #  define ATTR_NORETURN
56 #endif
57
58 /* hint to treat any non-null function return value cannot alias any other pointer */
59 #if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403))
60 #  define ATTR_MALLOC __attribute__((malloc))
61 #else
62 #  define ATTR_MALLOC
63 #endif
64
65 /* the function return value points to memory (2 args for 'size * tot') */
66 #if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403))
67 #  define ATTR_ALLOC_SIZE(args...) __attribute__((alloc_size(args)))
68 #else
69 #  define ATTR_ALLOC_SIZE(...)
70 #endif
71
72 /* ensures a NULL terminating argument as the n'th last argument of a variadic function */
73 #ifdef __GNUC__
74 #  define ATTR_SENTINEL(arg_pos) __attribute__((sentinel(arg_pos)))
75 #else
76 #  define ATTR_SENTINEL(arg_pos)
77 #endif
78
79 /* hint to compiler that function uses printf-style format string */
80 #ifdef __GNUC__
81 #  define ATTR_PRINTF_FORMAT(format_param, dots_param) \
82     __attribute__((format(printf, format_param, dots_param)))
83 #else
84 #  define ATTR_PRINTF_FORMAT(format_param, dots_param)
85 #endif
86
87 /* Use to suppress '-Wimplicit-fallthrough' (in place of 'break'). */
88 #ifndef ATTR_FALLTHROUGH
89 #  if defined(__GNUC__) && (__GNUC__ >= 7) /* gcc7.0+ only */
90 #    define ATTR_FALLTHROUGH __attribute__((fallthrough))
91 #  else
92 #    define ATTR_FALLTHROUGH ((void)0)
93 #  endif
94 #endif
95
96 /* Declare the memory alignment in Bytes. */
97 #if defined(_WIN32) && !defined(FREE_WINDOWS)
98 #  define ATTR_ALIGN(x) __declspec(align(x))
99 #else
100 #  define ATTR_ALIGN(x) __attribute__((aligned(x)))
101 #endif
102
103 #endif /* __BLI_COMPILER_ATTRS_H__ */