From 3401cf879f6d49014b031ed6879b84550b9672c7 Mon Sep 17 00:00:00 2001
From: Chris Lattner
Clang provides a number of ways to control which code constructs cause it to emit errors and warning messages, and how they are displayed to the console.
-When Clang emits a diagnostic, it includes rich information in the output, and gives you fine-grain control over which information is printed. Clang has @@ -394,18 +400,64 @@ it:
For more information please see Formatting of Diagnostics.
-mappings: ignore, note, warning, error, fatal
+All diagnostics are mapped into one of these 5 classes:
-The two major classes are control from the command line and control via pragmas -in your code.
+-W flags, -pedantic, etc
-pragma GCC diagnostic
+Clang can also control what diagnostics are enabled through the use of +pragmas in the source code. This is useful for turning off specific warnings +in a section of source code. Clang supports GCC's pragma for compatibility +with existing source code, as well as several extensions.
+ +The pragma may control any warning that can be used from the command line. +Warnings may be set to ignored, warning, error, or fatal. The following +example code will tell Clang or GCC to ignore the -Wall warnings:
+ ++#pragma GCC diagnostic ignored "-Wall" ++ +
In addition to all of the functionality of provided by GCC's pragma, Clang +also allows you to push and pop the current warning state. This is particularly +useful when writing a header file that will be compiled by other people, because +you don't know what warning flags they build with.
+ +In the below example +-Wmultichar is ignored for only a single line of code, after which the +diagnostics return to whatever state had previously existed.
+ ++#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmultichar" + +char b = 'df'; // no warning. + +#pragma clang diagnostic pop ++ +
The push and pop pragmas will save and restore the full diagnostic state of +the compiler, regardless of how it was set. That means that it is possible to +use push and pop around GCC compatible diagnostics and Clang will push and pop +them appropriately, while GCC will ignore the pushes and pops as unknown +pragmas. It should be noted that while Clang supports the GCC pragma, Clang and +GCC do not support the exact same set of warnings, so even when using GCC +compatible #pragmas there is no guarantee that they will have identical behaviour +on both compilers.