------------------------------------------------------------------------
6.62.13 Diagnostic Pragmas
GCC allows the user to selectively enable or disable certain types of
diagnostics, and change the kind of the diagnostic. For example, a
project’s policy might require that all sources compile with -Werror but
certain files might have exceptions allowing specific types of warnings.
Or, a project might selectively enable diagnostics and treat them as
errors depending on which preprocessor macros are defined.
|#pragma GCC diagnostic kind option|
Modifies the disposition of a diagnostic. Note that not all
diagnostics are modifiable; at the moment only warnings (normally
controlled by ‘-W…’) can be controlled, and not all of them. Use
-fdiagnostics-show-option to determine which diagnostics are
controllable and which option controls them.
kind is ‘error’ to treat this diagnostic as an error, ‘warning’ to
treat it like a warning (even if -Werror is in effect), or ‘ignored’
if the diagnostic is to be ignored. option is a double quoted string
that matches the command-line option.
#pragma GCC diagnostic warning "-Wformat"
#pragma GCC diagnostic error "-Wformat"
#pragma GCC diagnostic ignored "-Wformat"
Note that these pragmas override any command-line options. GCC keeps
track of the location of each pragma, and issues diagnostics
according to the state as of that point in the source file. Thus,
pragmas occurring after a line do not affect diagnostics caused by
that line.
|#pragma GCC diagnostic push|
|#pragma GCC diagnostic pop|
Causes GCC to remember the state of the diagnostics as of each
|push|, and restore to that point at each |pop|. If a |pop| has no
matching |push|, the command-line options are restored.
#pragma GCC diagnostic error "-Wuninitialized"
foo(a); /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
foo(b); /* no diagnostic for this one */
#pragma GCC diagnostic pop
foo(c); /* error is given for this one */
#pragma GCC diagnostic pop
foo(d); /* depends on command-line options */
in the example above the "push" and the "pop" does NOT match,
more "pop" than "push"
mfg, AO