Home | History | Annotate | Line # | Download | only in include
      1 /* Copyright (C) 2017-2024 Free Software Foundation, Inc.
      2 
      3    This program is free software; you can redistribute it and/or modify
      4    it under the terms of the GNU General Public License as published by
      5    the Free Software Foundation; either version 3 of the License, or
      6    (at your option) any later version.
      7 
      8    This program is distributed in the hope that it will be useful,
      9    but WITHOUT ANY WARRANTY; without even the implied warranty of
     10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11    GNU General Public License for more details.
     12 
     13    You should have received a copy of the GNU General Public License
     14    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     15 
     16 #ifndef DIAGNOSTICS_H
     17 #define DIAGNOSTICS_H
     18 
     19 /* If at all possible, fix the source rather than using these macros
     20    to silence warnings.  If you do use these macros be aware that
     21    you'll need to condition their use on particular compiler versions,
     22    which can be done for gcc using ansidecl.h's GCC_VERSION macro.
     23 
     24    gcc versions between 4.2 and 4.6 do not allow pragma control of
     25    diagnostics inside functions, giving a hard error if you try to use
     26    the finer control available with later versions.
     27    gcc prior to 4.2 warns about diagnostic push and pop.
     28 
     29    The other macros have restrictions too, for example gcc-5, gcc-6
     30    and gcc-7 warn that -Wstringop-truncation is unknown, unless you
     31    also add DIAGNOSTIC_IGNORE ("-Wpragma").  */
     32 
     33 #ifdef __GNUC__
     34 # define DIAGNOSTIC_PUSH _Pragma ("GCC diagnostic push")
     35 # define DIAGNOSTIC_POP _Pragma ("GCC diagnostic pop")
     36 
     37 /* Stringification.  */
     38 # define DIAGNOSTIC_STRINGIFY_1(x) #x
     39 # define DIAGNOSTIC_STRINGIFY(x) DIAGNOSTIC_STRINGIFY_1 (x)
     40 
     41 # define DIAGNOSTIC_IGNORE(option) \
     42   _Pragma (DIAGNOSTIC_STRINGIFY (GCC diagnostic ignored option))
     43 # define DIAGNOSTIC_ERROR(option) \
     44   _Pragma (DIAGNOSTIC_STRINGIFY (GCC diagnostic error option))
     45 #else
     46 # define DIAGNOSTIC_PUSH
     47 # define DIAGNOSTIC_POP
     48 # define DIAGNOSTIC_IGNORE(option)
     49 #endif
     50 
     51 #if defined (__clang__) /* clang */
     52 
     53 # define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move")
     54 # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS \
     55   DIAGNOSTIC_IGNORE ("-Wdeprecated-declarations")
     56 # define DIAGNOSTIC_IGNORE_REGISTER DIAGNOSTIC_IGNORE ("-Wregister")
     57 
     58 # if __has_warning ("-Wenum-compare-switch")
     59 #  define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES \
     60    DIAGNOSTIC_IGNORE ("-Wenum-compare-switch")
     61 # endif
     62 
     63 # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \
     64   DIAGNOSTIC_IGNORE ("-Wformat-nonliteral")
     65 
     66 # if __has_warning ("-Wuser-defined-warnings")
     67 #  define DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS \
     68    DIAGNOSTIC_IGNORE ("-Wuser-defined-warnings")
     69 # endif
     70 
     71 # if __has_warning ("-Wunused-but-set-variable")
     72 #  define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE \
     73    DIAGNOSTIC_IGNORE ("-Wunused-but-set-variable")
     74 # endif
     75 
     76 # define DIAGNOSTIC_ERROR_SWITCH \
     77   DIAGNOSTIC_ERROR ("-Wswitch")
     78 
     79 #elif defined (__GNUC__) /* GCC */
     80 
     81 # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS \
     82   DIAGNOSTIC_IGNORE ("-Wdeprecated-declarations")
     83 
     84 # if __GNUC__ >= 7
     85 #  define DIAGNOSTIC_IGNORE_REGISTER DIAGNOSTIC_IGNORE ("-Wregister")
     86 # endif
     87 
     88 # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION \
     89   DIAGNOSTIC_IGNORE ("-Wstringop-truncation")
     90 
     91 # if __GNUC__ >= 11
     92 # define DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD \
     93   DIAGNOSTIC_IGNORE ("-Wstringop-overread")
     94 #endif
     95 
     96 # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \
     97   DIAGNOSTIC_IGNORE ("-Wformat-nonliteral")
     98 
     99 # if __GNUC__ >= 5
    100 #  define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE \
    101    DIAGNOSTIC_IGNORE ("-Wunused-but-set-variable")
    102 # endif
    103 
    104 # if __GNUC__ >= 13
    105 #  define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move")
    106 # endif
    107 
    108 /* GCC 4.8's "diagnostic push/pop" seems broken when using this, -Wswitch
    109    remains enabled at the error level even after a pop.  Therefore, don't
    110    use it for GCC < 5.  */
    111 # if __GNUC__ >= 5
    112 #  define DIAGNOSTIC_ERROR_SWITCH DIAGNOSTIC_ERROR ("-Wswitch")
    113 # endif
    114 
    115 #endif
    116 
    117 #ifndef DIAGNOSTIC_IGNORE_SELF_MOVE
    118 # define DIAGNOSTIC_IGNORE_SELF_MOVE
    119 #endif
    120 
    121 #ifndef DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
    122 # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
    123 #endif
    124 
    125 #ifndef DIAGNOSTIC_IGNORE_REGISTER
    126 # define DIAGNOSTIC_IGNORE_REGISTER
    127 #endif
    128 
    129 #ifndef DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES
    130 # define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES
    131 #endif
    132 
    133 #ifndef DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION
    134 # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION
    135 #endif
    136 
    137 #ifndef DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD
    138 # define DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD
    139 #endif
    140 
    141 #ifndef DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
    142 # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
    143 #endif
    144 
    145 #ifndef DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS
    146 # define DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS
    147 #endif
    148 
    149 #ifndef DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE
    150 # define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE
    151 #endif
    152 
    153 #ifndef DIAGNOSTIC_ERROR_SWITCH
    154 # define DIAGNOSTIC_ERROR_SWITCH
    155 #endif
    156 
    157 #endif /* DIAGNOSTICS_H */
    158