Home | History | Annotate | Line # | Download | only in include
diagnostics.h revision 1.1.1.4
      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_DEPRECATED_REGISTER \
     57   DIAGNOSTIC_IGNORE ("-Wdeprecated-register")
     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 # if __has_warning ("-Wenum-constexpr-conversion")
     80 #  define DIAGNOSTIC_IGNORE_ENUM_CONSTEXPR_CONVERSION \
     81    DIAGNOSTIC_IGNORE ("-Wenum-constexpr-conversion")
     82 # endif
     83 
     84 #elif defined (__GNUC__) /* GCC */
     85 
     86 # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS \
     87   DIAGNOSTIC_IGNORE ("-Wdeprecated-declarations")
     88 
     89 # if __GNUC__ >= 7
     90 #  define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER \
     91    DIAGNOSTIC_IGNORE ("-Wregister")
     92 # endif
     93 
     94 # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION \
     95   DIAGNOSTIC_IGNORE ("-Wstringop-truncation")
     96 
     97 # if __GNUC__ >= 11
     98 # define DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD \
     99   DIAGNOSTIC_IGNORE ("-Wstringop-overread")
    100 #endif
    101 
    102 # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \
    103   DIAGNOSTIC_IGNORE ("-Wformat-nonliteral")
    104 
    105 # if __GNUC__ >= 5
    106 #  define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE \
    107    DIAGNOSTIC_IGNORE ("-Wunused-but-set-variable")
    108 # endif
    109 
    110 # if __GNUC__ >= 13
    111 #  define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move")
    112 # endif
    113 
    114 /* GCC 4.8's "diagnostic push/pop" seems broken when using this, -Wswitch
    115    remains enabled at the error level even after a pop.  Therefore, don't
    116    use it for GCC < 5.  */
    117 # if __GNUC__ >= 5
    118 #  define DIAGNOSTIC_ERROR_SWITCH DIAGNOSTIC_ERROR ("-Wswitch")
    119 # endif
    120 
    121 #endif
    122 
    123 #ifndef DIAGNOSTIC_IGNORE_SELF_MOVE
    124 # define DIAGNOSTIC_IGNORE_SELF_MOVE
    125 #endif
    126 
    127 #ifndef DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
    128 # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
    129 #endif
    130 
    131 #ifndef DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER
    132 # define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER
    133 #endif
    134 
    135 #ifndef DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES
    136 # define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES
    137 #endif
    138 
    139 #ifndef DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION
    140 # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION
    141 #endif
    142 
    143 #ifndef DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD
    144 # define DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD
    145 #endif
    146 
    147 #ifndef DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
    148 # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
    149 #endif
    150 
    151 #ifndef DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS
    152 # define DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS
    153 #endif
    154 
    155 #ifndef DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE
    156 # define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE
    157 #endif
    158 
    159 #ifndef DIAGNOSTIC_ERROR_SWITCH
    160 # define DIAGNOSTIC_ERROR_SWITCH
    161 #endif
    162 
    163 #ifndef DIAGNOSTIC_IGNORE_ENUM_CONSTEXPR_CONVERSION
    164 # define DIAGNOSTIC_IGNORE_ENUM_CONSTEXPR_CONVERSION
    165 #endif
    166 
    167 #endif /* DIAGNOSTICS_H */
    168