1*fae548d3Szrj /* Copyright (C) 2017-2020 Free Software Foundation, Inc. 2*fae548d3Szrj 3*fae548d3Szrj This program is free software; you can redistribute it and/or modify 4*fae548d3Szrj it under the terms of the GNU General Public License as published by 5*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or 6*fae548d3Szrj (at your option) any later version. 7*fae548d3Szrj 8*fae548d3Szrj This program is distributed in the hope that it will be useful, 9*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 10*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11*fae548d3Szrj GNU General Public License for more details. 12*fae548d3Szrj 13*fae548d3Szrj You should have received a copy of the GNU General Public License 14*fae548d3Szrj along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15*fae548d3Szrj 16*fae548d3Szrj #ifndef DIAGNOSTICS_H 17*fae548d3Szrj #define DIAGNOSTICS_H 18*fae548d3Szrj 19*fae548d3Szrj /* If at all possible, fix the source rather than using these macros 20*fae548d3Szrj to silence warnings. If you do use these macros be aware that 21*fae548d3Szrj you'll need to condition their use on particular compiler versions, 22*fae548d3Szrj which can be done for gcc using ansidecl.h's GCC_VERSION macro. 23*fae548d3Szrj 24*fae548d3Szrj gcc versions between 4.2 and 4.6 do not allow pragma control of 25*fae548d3Szrj diagnostics inside functions, giving a hard error if you try to use 26*fae548d3Szrj the finer control available with later versions. 27*fae548d3Szrj gcc prior to 4.2 warns about diagnostic push and pop. 28*fae548d3Szrj 29*fae548d3Szrj The other macros have restrictions too, for example gcc-5, gcc-6 30*fae548d3Szrj and gcc-7 warn that -Wstringop-truncation is unknown, unless you 31*fae548d3Szrj also add DIAGNOSTIC_IGNORE ("-Wpragma"). */ 32*fae548d3Szrj 33*fae548d3Szrj #ifdef __GNUC__ 34*fae548d3Szrj # define DIAGNOSTIC_PUSH _Pragma ("GCC diagnostic push") 35*fae548d3Szrj # define DIAGNOSTIC_POP _Pragma ("GCC diagnostic pop") 36*fae548d3Szrj 37*fae548d3Szrj /* Stringification. */ 38*fae548d3Szrj # define DIAGNOSTIC_STRINGIFY_1(x) #x 39*fae548d3Szrj # define DIAGNOSTIC_STRINGIFY(x) DIAGNOSTIC_STRINGIFY_1 (x) 40*fae548d3Szrj 41*fae548d3Szrj # define DIAGNOSTIC_IGNORE(option) \ 42*fae548d3Szrj _Pragma (DIAGNOSTIC_STRINGIFY (GCC diagnostic ignored option)) 43*fae548d3Szrj #else 44*fae548d3Szrj # define DIAGNOSTIC_PUSH 45*fae548d3Szrj # define DIAGNOSTIC_POP 46*fae548d3Szrj # define DIAGNOSTIC_IGNORE(option) 47*fae548d3Szrj #endif 48*fae548d3Szrj 49*fae548d3Szrj #if defined (__clang__) /* clang */ 50*fae548d3Szrj 51*fae548d3Szrj # define DIAGNOSTIC_IGNORE_SELF_MOVE DIAGNOSTIC_IGNORE ("-Wself-move") 52*fae548d3Szrj # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS \ 53*fae548d3Szrj DIAGNOSTIC_IGNORE ("-Wdeprecated-declarations") 54*fae548d3Szrj # define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER \ 55*fae548d3Szrj DIAGNOSTIC_IGNORE ("-Wdeprecated-register") 56*fae548d3Szrj # if __has_warning ("-Wenum-compare-switch") 57*fae548d3Szrj # define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES \ 58*fae548d3Szrj DIAGNOSTIC_IGNORE ("-Wenum-compare-switch") 59*fae548d3Szrj # endif 60*fae548d3Szrj 61*fae548d3Szrj # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \ 62*fae548d3Szrj DIAGNOSTIC_IGNORE ("-Wformat-nonliteral") 63*fae548d3Szrj 64*fae548d3Szrj #elif defined (__GNUC__) /* GCC */ 65*fae548d3Szrj 66*fae548d3Szrj # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION \ 67*fae548d3Szrj DIAGNOSTIC_IGNORE ("-Wstringop-truncation") 68*fae548d3Szrj 69*fae548d3Szrj # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \ 70*fae548d3Szrj DIAGNOSTIC_IGNORE ("-Wformat-nonliteral") 71*fae548d3Szrj 72*fae548d3Szrj #endif 73*fae548d3Szrj 74*fae548d3Szrj #ifndef DIAGNOSTIC_IGNORE_SELF_MOVE 75*fae548d3Szrj # define DIAGNOSTIC_IGNORE_SELF_MOVE 76*fae548d3Szrj #endif 77*fae548d3Szrj 78*fae548d3Szrj #ifndef DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS 79*fae548d3Szrj # define DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS 80*fae548d3Szrj #endif 81*fae548d3Szrj 82*fae548d3Szrj #ifndef DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER 83*fae548d3Szrj # define DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER 84*fae548d3Szrj #endif 85*fae548d3Szrj 86*fae548d3Szrj #ifndef DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES 87*fae548d3Szrj # define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES 88*fae548d3Szrj #endif 89*fae548d3Szrj 90*fae548d3Szrj #ifndef DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION 91*fae548d3Szrj # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION 92*fae548d3Szrj #endif 93*fae548d3Szrj 94*fae548d3Szrj #ifndef DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL 95*fae548d3Szrj # define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL 96*fae548d3Szrj #endif 97*fae548d3Szrj 98*fae548d3Szrj #endif /* DIAGNOSTICS_H */ 99