|  | /* Copyright (C) 2017-2023 Free Software Foundation, Inc. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #ifndef DIAGNOSTICS_H | 
|  | #define DIAGNOSTICS_H | 
|  |  | 
|  | /* If at all possible, fix the source rather than using these macros | 
|  | to silence warnings.  If you do use these macros be aware that | 
|  | you'll need to condition their use on particular compiler versions, | 
|  | which can be done for gcc using ansidecl.h's GCC_VERSION macro. | 
|  |  | 
|  | gcc versions between 4.2 and 4.6 do not allow pragma control of | 
|  | diagnostics inside functions, giving a hard error if you try to use | 
|  | the finer control available with later versions. | 
|  | gcc prior to 4.2 warns about diagnostic push and pop. | 
|  |  | 
|  | The other macros have restrictions too, for example gcc-5, gcc-6 | 
|  | and gcc-7 warn that -Wstringop-truncation is unknown, unless you | 
|  | also add DIAGNOSTIC_IGNORE ("-Wpragma").  */ | 
|  |  | 
|  | #ifdef __GNUC__ | 
|  | # define DIAGNOSTIC_PUSH _Pragma ("GCC diagnostic push") | 
|  | # define DIAGNOSTIC_POP _Pragma ("GCC diagnostic pop") | 
|  |  | 
|  | /* Stringification.  */ | 
|  | # define DIAGNOSTIC_STRINGIFY_1(x) #x | 
|  | # define DIAGNOSTIC_STRINGIFY(x) DIAGNOSTIC_STRINGIFY_1 (x) | 
|  |  | 
|  | # define DIAGNOSTIC_IGNORE(option) \ | 
|  | _Pragma (DIAGNOSTIC_STRINGIFY (GCC diagnostic ignored option)) | 
|  | # define DIAGNOSTIC_ERROR(option) \ | 
|  | _Pragma (DIAGNOSTIC_STRINGIFY (GCC diagnostic error option)) | 
|  | #else | 
|  | # define DIAGNOSTIC_PUSH | 
|  | # define DIAGNOSTIC_POP | 
|  | # define DIAGNOSTIC_IGNORE(option) | 
|  | #endif | 
|  |  | 
|  | #if defined (__clang__) /* clang */ | 
|  |  | 
|  | # define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move") | 
|  | # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS \ | 
|  | DIAGNOSTIC_IGNORE ("-Wdeprecated-declarations") | 
|  | # define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER \ | 
|  | DIAGNOSTIC_IGNORE ("-Wdeprecated-register") | 
|  | # if __has_warning ("-Wenum-compare-switch") | 
|  | #  define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES \ | 
|  | DIAGNOSTIC_IGNORE ("-Wenum-compare-switch") | 
|  | # endif | 
|  |  | 
|  | # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \ | 
|  | DIAGNOSTIC_IGNORE ("-Wformat-nonliteral") | 
|  |  | 
|  | # if __has_warning ("-Wuser-defined-warnings") | 
|  | #  define DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS \ | 
|  | DIAGNOSTIC_IGNORE ("-Wuser-defined-warnings") | 
|  | # endif | 
|  |  | 
|  | # if __has_warning ("-Wunused-but-set-variable") | 
|  | #  define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE \ | 
|  | DIAGNOSTIC_IGNORE ("-Wunused-but-set-variable") | 
|  | # endif | 
|  |  | 
|  | # define DIAGNOSTIC_ERROR_SWITCH \ | 
|  | DIAGNOSTIC_ERROR ("-Wswitch") | 
|  |  | 
|  | # if __has_warning ("-Wenum-constexpr-conversion") | 
|  | #  define DIAGNOSTIC_IGNORE_ENUM_CONSTEXPR_CONVERSION \ | 
|  | DIAGNOSTIC_IGNORE ("-Wenum-constexpr-conversion") | 
|  | # endif | 
|  |  | 
|  | #elif defined (__GNUC__) /* GCC */ | 
|  |  | 
|  | # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS \ | 
|  | DIAGNOSTIC_IGNORE ("-Wdeprecated-declarations") | 
|  |  | 
|  | # if __GNUC__ >= 7 | 
|  | #  define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER \ | 
|  | DIAGNOSTIC_IGNORE ("-Wregister") | 
|  | # endif | 
|  |  | 
|  | # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION \ | 
|  | DIAGNOSTIC_IGNORE ("-Wstringop-truncation") | 
|  |  | 
|  | # if __GNUC__ >= 11 | 
|  | # define DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD \ | 
|  | DIAGNOSTIC_IGNORE ("-Wstringop-overread") | 
|  | #endif | 
|  |  | 
|  | # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \ | 
|  | DIAGNOSTIC_IGNORE ("-Wformat-nonliteral") | 
|  |  | 
|  | # if __GNUC__ >= 5 | 
|  | #  define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE \ | 
|  | DIAGNOSTIC_IGNORE ("-Wunused-but-set-variable") | 
|  | # endif | 
|  |  | 
|  | # if __GNUC__ >= 13 | 
|  | #  define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move") | 
|  | # endif | 
|  |  | 
|  | /* GCC 4.8's "diagnostic push/pop" seems broken when using this, -Wswitch | 
|  | remains enabled at the error level even after a pop.  Therefore, don't | 
|  | use it for GCC < 5.  */ | 
|  | # if __GNUC__ >= 5 | 
|  | #  define DIAGNOSTIC_ERROR_SWITCH DIAGNOSTIC_ERROR ("-Wswitch") | 
|  | # endif | 
|  |  | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_SELF_MOVE | 
|  | # define DIAGNOSTIC_IGNORE_SELF_MOVE | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS | 
|  | # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER | 
|  | # define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES | 
|  | # define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION | 
|  | # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD | 
|  | # define DIAGNOSTIC_IGNORE_STRINGOP_OVERREAD | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL | 
|  | # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS | 
|  | # define DIAGNOSTIC_IGNORE_USER_DEFINED_WARNINGS | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE | 
|  | # define DIAGNOSTIC_IGNORE_UNUSED_BUT_SET_VARIABLE | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_ERROR_SWITCH | 
|  | # define DIAGNOSTIC_ERROR_SWITCH | 
|  | #endif | 
|  |  | 
|  | #ifndef DIAGNOSTIC_IGNORE_ENUM_CONSTEXPR_CONVERSION | 
|  | # define DIAGNOSTIC_IGNORE_ENUM_CONSTEXPR_CONVERSION | 
|  | #endif | 
|  |  | 
|  | #endif /* DIAGNOSTICS_H */ |