xref: /Universal-ctags/gnulib/attribute.h (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_* macros for using attributes in GCC and similar compilers
2*820c1a8dSHiroo HAYASHI 
3*820c1a8dSHiroo HAYASHI    Copyright 2020-2021 Free Software Foundation, Inc.
4*820c1a8dSHiroo HAYASHI 
5*820c1a8dSHiroo HAYASHI    This file is free software: you can redistribute it and/or modify
6*820c1a8dSHiroo HAYASHI    it under the terms of the GNU Lesser General Public License as
7*820c1a8dSHiroo HAYASHI    published by the Free Software Foundation; either version 2.1 of the
8*820c1a8dSHiroo HAYASHI    License, or (at your option) any later version.
9*820c1a8dSHiroo HAYASHI 
10*820c1a8dSHiroo HAYASHI    This file is distributed in the hope that it will be useful,
11*820c1a8dSHiroo HAYASHI    but WITHOUT ANY WARRANTY; without even the implied warranty of
12*820c1a8dSHiroo HAYASHI    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*820c1a8dSHiroo HAYASHI    GNU Lesser General Public License for more details.
14*820c1a8dSHiroo HAYASHI 
15*820c1a8dSHiroo HAYASHI    You should have received a copy of the GNU Lesser General Public License
16*820c1a8dSHiroo HAYASHI    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
17*820c1a8dSHiroo HAYASHI 
18*820c1a8dSHiroo HAYASHI /* Written by Paul Eggert.  */
19*820c1a8dSHiroo HAYASHI 
20*820c1a8dSHiroo HAYASHI /* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_*
21*820c1a8dSHiroo HAYASHI    macros used within Gnulib.  */
22*820c1a8dSHiroo HAYASHI 
23*820c1a8dSHiroo HAYASHI /* These attributes can be placed in two ways:
24*820c1a8dSHiroo HAYASHI      - At the start of a declaration (i.e. even before storage-class
25*820c1a8dSHiroo HAYASHI        specifiers!); then they apply to all entities that are declared
26*820c1a8dSHiroo HAYASHI        by the declaration.
27*820c1a8dSHiroo HAYASHI      - Immediately after the name of an entity being declared by the
28*820c1a8dSHiroo HAYASHI        declaration; then they apply to that entity only.  */
29*820c1a8dSHiroo HAYASHI 
30*820c1a8dSHiroo HAYASHI #ifndef _GL_ATTRIBUTE_H
31*820c1a8dSHiroo HAYASHI #define _GL_ATTRIBUTE_H
32*820c1a8dSHiroo HAYASHI 
33*820c1a8dSHiroo HAYASHI 
34*820c1a8dSHiroo HAYASHI /* This file defines two types of attributes:
35*820c1a8dSHiroo HAYASHI    * C2X standard attributes.  These have macro names that do not begin with
36*820c1a8dSHiroo HAYASHI      'ATTRIBUTE_'.
37*820c1a8dSHiroo HAYASHI    * Selected GCC attributes; see:
38*820c1a8dSHiroo HAYASHI      https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
39*820c1a8dSHiroo HAYASHI      https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
40*820c1a8dSHiroo HAYASHI      https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
41*820c1a8dSHiroo HAYASHI      These names begin with 'ATTRIBUTE_' to avoid name clashes.  */
42*820c1a8dSHiroo HAYASHI 
43*820c1a8dSHiroo HAYASHI 
44*820c1a8dSHiroo HAYASHI /* =============== Attributes for specific kinds of functions =============== */
45*820c1a8dSHiroo HAYASHI 
46*820c1a8dSHiroo HAYASHI /* Attributes for functions that should not be used.  */
47*820c1a8dSHiroo HAYASHI 
48*820c1a8dSHiroo HAYASHI /* Warn if the entity is used.  */
49*820c1a8dSHiroo HAYASHI /* Applies to:
50*820c1a8dSHiroo HAYASHI      - function, variable,
51*820c1a8dSHiroo HAYASHI      - struct, union, struct/union member,
52*820c1a8dSHiroo HAYASHI      - enumeration, enumeration item,
53*820c1a8dSHiroo HAYASHI      - typedef,
54*820c1a8dSHiroo HAYASHI    in C++ also: namespace, class, template specialization.  */
55*820c1a8dSHiroo HAYASHI #define DEPRECATED _GL_ATTRIBUTE_DEPRECATED
56*820c1a8dSHiroo HAYASHI 
57*820c1a8dSHiroo HAYASHI /* If a function call is not optimized way, warn with MSG.  */
58*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
59*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg)
60*820c1a8dSHiroo HAYASHI 
61*820c1a8dSHiroo HAYASHI /* If a function call is not optimized way, report an error with MSG.  */
62*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
63*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg)
64*820c1a8dSHiroo HAYASHI 
65*820c1a8dSHiroo HAYASHI 
66*820c1a8dSHiroo HAYASHI /* Attributes for memory-allocating functions.  */
67*820c1a8dSHiroo HAYASHI 
68*820c1a8dSHiroo HAYASHI /* The function returns a pointer to freshly allocated memory.  */
69*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
70*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC
71*820c1a8dSHiroo HAYASHI 
72*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function
73*820c1a8dSHiroo HAYASHI    is the size of the returned memory block.
74*820c1a8dSHiroo HAYASHI    ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments
75*820c1a8dSHiroo HAYASHI    to determine the size of the returned memory block.  */
76*820c1a8dSHiroo HAYASHI /* Applies to: function, pointer to function, function types.  */
77*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args)
78*820c1a8dSHiroo HAYASHI 
79*820c1a8dSHiroo HAYASHI 
80*820c1a8dSHiroo HAYASHI /* Attributes for variadic functions.  */
81*820c1a8dSHiroo HAYASHI 
82*820c1a8dSHiroo HAYASHI /* The variadic function expects a trailing NULL argument.
83*820c1a8dSHiroo HAYASHI    ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
84*820c1a8dSHiroo HAYASHI    ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL.  */
85*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
86*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos)
87*820c1a8dSHiroo HAYASHI 
88*820c1a8dSHiroo HAYASHI 
89*820c1a8dSHiroo HAYASHI /* ================== Attributes for compiler diagnostics ================== */
90*820c1a8dSHiroo HAYASHI 
91*820c1a8dSHiroo HAYASHI /* Attributes that help the compiler diagnose programmer mistakes.
92*820c1a8dSHiroo HAYASHI    Some of them may also help for some compiler optimizations.  */
93*820c1a8dSHiroo HAYASHI 
94*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) -
95*820c1a8dSHiroo HAYASHI    The STRING-INDEXth function argument is a format string of style
96*820c1a8dSHiroo HAYASHI    ARCHETYPE, which is one of:
97*820c1a8dSHiroo HAYASHI      printf, gnu_printf
98*820c1a8dSHiroo HAYASHI      scanf, gnu_scanf,
99*820c1a8dSHiroo HAYASHI      strftime, gnu_strftime,
100*820c1a8dSHiroo HAYASHI      strfmon,
101*820c1a8dSHiroo HAYASHI    or the same thing prefixed and suffixed with '__'.
102*820c1a8dSHiroo HAYASHI    If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
103*820c1a8dSHiroo HAYASHI    are suitable for the format string.  */
104*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
105*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec)
106*820c1a8dSHiroo HAYASHI 
107*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL.
108*820c1a8dSHiroo HAYASHI    ATTRIBUTE_NONNULL () - All pointer arguments must not be null.  */
109*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
110*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args)
111*820c1a8dSHiroo HAYASHI 
112*820c1a8dSHiroo HAYASHI /* The function's return value is a non-NULL pointer.  */
113*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
114*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL
115*820c1a8dSHiroo HAYASHI 
116*820c1a8dSHiroo HAYASHI /* Warn if the caller does not use the return value,
117*820c1a8dSHiroo HAYASHI    unless the caller uses something like ignore_value.  */
118*820c1a8dSHiroo HAYASHI /* Applies to: function, enumeration, class.  */
119*820c1a8dSHiroo HAYASHI #define NODISCARD _GL_ATTRIBUTE_NODISCARD
120*820c1a8dSHiroo HAYASHI 
121*820c1a8dSHiroo HAYASHI 
122*820c1a8dSHiroo HAYASHI /* Attributes that disable false alarms when the compiler diagnoses
123*820c1a8dSHiroo HAYASHI    programmer "mistakes".  */
124*820c1a8dSHiroo HAYASHI 
125*820c1a8dSHiroo HAYASHI /* Do not warn if the entity is not used.  */
126*820c1a8dSHiroo HAYASHI /* Applies to:
127*820c1a8dSHiroo HAYASHI      - function, variable,
128*820c1a8dSHiroo HAYASHI      - struct, union, struct/union member,
129*820c1a8dSHiroo HAYASHI      - enumeration, enumeration item,
130*820c1a8dSHiroo HAYASHI      - typedef,
131*820c1a8dSHiroo HAYASHI    in C++ also: class.  */
132*820c1a8dSHiroo HAYASHI #define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
133*820c1a8dSHiroo HAYASHI 
134*820c1a8dSHiroo HAYASHI /* The contents of a character array is not meant to be NUL-terminated.  */
135*820c1a8dSHiroo HAYASHI /* Applies to: struct/union members and variables that are arrays of element
136*820c1a8dSHiroo HAYASHI    type '[[un]signed] char'.  */
137*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING
138*820c1a8dSHiroo HAYASHI 
139*820c1a8dSHiroo HAYASHI /* Do not warn if control flow falls through to the immediately
140*820c1a8dSHiroo HAYASHI    following 'case' or 'default' label.  */
141*820c1a8dSHiroo HAYASHI /* Applies to: Empty statement (;), inside a 'switch' statement.  */
142*820c1a8dSHiroo HAYASHI #define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH
143*820c1a8dSHiroo HAYASHI 
144*820c1a8dSHiroo HAYASHI 
145*820c1a8dSHiroo HAYASHI /* ================== Attributes for debugging information ================== */
146*820c1a8dSHiroo HAYASHI 
147*820c1a8dSHiroo HAYASHI /* Attributes regarding debugging information emitted by the compiler.  */
148*820c1a8dSHiroo HAYASHI 
149*820c1a8dSHiroo HAYASHI /* Omit the function from stack traces when debugging.  */
150*820c1a8dSHiroo HAYASHI /* Applies to: function.  */
151*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL
152*820c1a8dSHiroo HAYASHI 
153*820c1a8dSHiroo HAYASHI /* Make the entity visible to debuggers etc., even with '-fwhole-program'.  */
154*820c1a8dSHiroo HAYASHI /* Applies to: functions, variables.  */
155*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
156*820c1a8dSHiroo HAYASHI 
157*820c1a8dSHiroo HAYASHI 
158*820c1a8dSHiroo HAYASHI /* ========== Attributes that mainly direct compiler optimizations ========== */
159*820c1a8dSHiroo HAYASHI 
160*820c1a8dSHiroo HAYASHI /* The function does not throw exceptions.  */
161*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
162*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW
163*820c1a8dSHiroo HAYASHI 
164*820c1a8dSHiroo HAYASHI /* Do not inline the function.  */
165*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
166*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE
167*820c1a8dSHiroo HAYASHI 
168*820c1a8dSHiroo HAYASHI /* Always inline the function, and report an error if the compiler
169*820c1a8dSHiroo HAYASHI    cannot inline.  */
170*820c1a8dSHiroo HAYASHI /* Applies to: function.  */
171*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
172*820c1a8dSHiroo HAYASHI 
173*820c1a8dSHiroo HAYASHI /* It is OK for a compiler to omit duplicate calls with the same arguments.
174*820c1a8dSHiroo HAYASHI    This attribute is safe for a function that neither depends on
175*820c1a8dSHiroo HAYASHI    nor affects observable state, and always returns exactly once -
176*820c1a8dSHiroo HAYASHI    e.g., does not loop forever, and does not call longjmp.
177*820c1a8dSHiroo HAYASHI    (This attribute is stricter than ATTRIBUTE_PURE.)  */
178*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
179*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
180*820c1a8dSHiroo HAYASHI 
181*820c1a8dSHiroo HAYASHI /* It is OK for a compiler to omit duplicate calls with the same
182*820c1a8dSHiroo HAYASHI    arguments if observable state is not changed between calls.
183*820c1a8dSHiroo HAYASHI    This attribute is safe for a function that does not affect
184*820c1a8dSHiroo HAYASHI    observable state, and always returns exactly once.
185*820c1a8dSHiroo HAYASHI    (This attribute is looser than ATTRIBUTE_CONST.)  */
186*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
187*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
188*820c1a8dSHiroo HAYASHI 
189*820c1a8dSHiroo HAYASHI /* The function is rarely executed.  */
190*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
191*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD
192*820c1a8dSHiroo HAYASHI 
193*820c1a8dSHiroo HAYASHI /* If called from some other compilation unit, the function executes
194*820c1a8dSHiroo HAYASHI    code from that unit only by return or by exception handling,
195*820c1a8dSHiroo HAYASHI    letting the compiler optimize that unit more aggressively.  */
196*820c1a8dSHiroo HAYASHI /* Applies to: functions.  */
197*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF
198*820c1a8dSHiroo HAYASHI 
199*820c1a8dSHiroo HAYASHI /* For struct members: The member has the smallest possible alignment.
200*820c1a8dSHiroo HAYASHI    For struct, union, class: All members have the smallest possible alignment,
201*820c1a8dSHiroo HAYASHI    minimizing the memory required.  */
202*820c1a8dSHiroo HAYASHI /* Applies to: struct members, struct, union,
203*820c1a8dSHiroo HAYASHI    in C++ also: class.  */
204*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED
205*820c1a8dSHiroo HAYASHI 
206*820c1a8dSHiroo HAYASHI 
207*820c1a8dSHiroo HAYASHI /* ================ Attributes that make invalid code valid ================ */
208*820c1a8dSHiroo HAYASHI 
209*820c1a8dSHiroo HAYASHI /* Attributes that prevent fatal compiler optimizations for code that is not
210*820c1a8dSHiroo HAYASHI    fully ISO C compliant.  */
211*820c1a8dSHiroo HAYASHI 
212*820c1a8dSHiroo HAYASHI /* Pointers to the type may point to the same storage as pointers to
213*820c1a8dSHiroo HAYASHI    other types, thus disabling strict aliasing optimization.  */
214*820c1a8dSHiroo HAYASHI /* Applies to: types.  */
215*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS
216*820c1a8dSHiroo HAYASHI 
217*820c1a8dSHiroo HAYASHI 
218*820c1a8dSHiroo HAYASHI #endif /* _GL_ATTRIBUTE_H */
219