root/maint/gnulib/lib/attribute.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


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

/* [previous][next][first][last][top][bottom][index][help] */