| /* Macros for controlling diagnostic output from the compiler. |
| Copyright (C) 2014-2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library 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 |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef _LIBC_DIAG_H |
| #define _LIBC_DIAG_H 1 |
| |
| /* Ignore the value of an expression when a cast to void does not |
| suffice (in particular, for a call to a function declared with |
| attribute warn_unused_result). */ |
| #define ignore_value(x) \ |
| ({ __typeof__ (x) __ignored_value = (x); (void) __ignored_value; }) |
| |
| /* The macros to control diagnostics are structured like this, rather |
| than a single macro that both pushes and pops diagnostic state and |
| takes the affected code as an argument, because the GCC pragmas |
| work by disabling the diagnostic for a range of source locations |
| and do not work when all the pragmas and the affected code are in a |
| single macro expansion. */ |
| |
| /* Push diagnostic state. */ |
| #define DIAG_PUSH_NEEDS_COMMENT _Pragma ("GCC diagnostic push") |
| |
| /* Pop diagnostic state. */ |
| #define DIAG_POP_NEEDS_COMMENT _Pragma ("GCC diagnostic pop") |
| |
| #define _DIAG_STR1(s) #s |
| #define _DIAG_STR(s) _DIAG_STR1(s) |
| |
| /* Ignore the diagnostic OPTION. VERSION is the most recent GCC |
| version for which the diagnostic has been confirmed to appear in |
| the absence of the pragma (in the form MAJOR.MINOR for GCC 4.x, |
| just MAJOR for GCC 5 and later). Uses of this pragma should be |
| reviewed when the GCC version given is no longer supported for |
| building glibc; the version number should always be on the same |
| source line as the macro name, so such uses can be found with grep. |
| Uses should come with a comment giving more details of the |
| diagnostic, and an architecture on which it is seen if possibly |
| optimization-related and not in architecture-specific code. This |
| macro should only be used if the diagnostic seems hard to fix (for |
| example, optimization-related false positives). */ |
| #define DIAG_IGNORE_NEEDS_COMMENT(version, option) \ |
| _Pragma (_DIAG_STR (GCC diagnostic ignored option)) |
| |
| /* Similar to DIAG_IGNORE_NEEDS_COMMENT the following macro ignores the |
| diagnostic OPTION but only if optimizations for size are enabled. |
| This is required because different warnings may be generated for |
| different optimization levels. For example a key piece of code may |
| only generate a warning when compiled at -Os, but at -O2 you could |
| still want the warning to be enabled to catch errors. In this case |
| you would use DIAG_IGNORE_Os_NEEDS_COMMENT to disable the warning |
| only for -Os. */ |
| #ifdef __OPTIMIZE_SIZE__ |
| # define DIAG_IGNORE_Os_NEEDS_COMMENT(version, option) \ |
| _Pragma (_DIAG_STR (GCC diagnostic ignored option)) |
| #else |
| # define DIAG_IGNORE_Os_NEEDS_COMMENT(version, option) |
| #endif |
| |
| #endif /* libc-diag.h */ |