Merge branch 'blender2.7'
[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) __attribute__((format(printf, format_param, dots_param)))
82 #else
83 #  define ATTR_PRINTF_FORMAT(format_param, dots_param)
84 #endif
85
86 /* Use to suppress '-Wimplicit-fallthrough' (in place of 'break'). */
87 #ifndef ATTR_FALLTHROUGH
88 #  if defined(__GNUC__) && (__GNUC__ >= 7)  /* gcc7.0+ only */
89 #    define ATTR_FALLTHROUGH __attribute__((fallthrough))
90 #  else
91 #    define ATTR_FALLTHROUGH ((void)0)
92 #  endif
93 #endif
94
95 /* Declare the memory alignment in Bytes. */
96 #if defined(_WIN32) && !defined(FREE_WINDOWS)
97 #  define ATTR_ALIGN(x) __declspec(align(x))
98 #else
99 #  define ATTR_ALIGN(x) __attribute__((aligned(x)))
100 #endif
101
102 #endif  /* __BLI_COMPILER_ATTRS_H__ */