I generally compile code with as many warnings enabled as I can, and -Werror. Clang is great for that since it has a lot more flexible options for handling warnings than gcc. It also adopted gcc's recent diagnostic pragmas, which allow one to embed the warning controls directly around the relevant code.
Obviously, doing that in a way that is compatible with gcc was important, but gcc's pragma is deficient in a few ways. The big one is that it has no sort of push/pop semantics, like the pack pragmas. This impacts me since I have some warnings I want to disable in a small section of a header. Unfortunately it is impossible to set the warnings back to the state they were in before that bit of code. It is not just a header issue, since realistically people want to change command line warnings at various points, but the current pragmas force permanent changes in the diagnostic configuration for the entire rest of that compilation unit, despite the change usually only being relevant for a few lines of code.
With that in mind, I would like to propose an extension to the current pragma to add push/pop functionality (similiar to that of pack). There are a couple of ways that this could be done. The first code be to prefix push onto the existing pragmas:
#pragma clang diagnostic push ignored "-Wmultichar"
char d = 'df'; // no warning.
#pragma clang diagnostic pop
That has the benefit of being concise, but it would mean we could have complicated situations like:
#pragma clang diagnostic push ignored "-Wmultichar"
#pragma clang diagnostic warning "-Wall"
char d = 'df'; // no warning.
#pragma clang diagnostic pop
It is unclear what the correct behavior of the pop should be at that point. Should pop all the way back to the push, should it attempt to regenerate a diagnostic state without the push put with the warning "-Wall" ? We could choose something, but it seems to me like it is not worth it. Another option to make push and pop explicit it commands:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
char d = 'df'; // no warning.
#pragma clang diagnostic pop
The above is slightly less concise in the normal case, but the behavior of the pragma in the presence of multiple changes is clear. There are some other things that are possible with implicit popping and so forth, but they all seem to have complicated behaviors when they nest, and in this case I am in favor of simple, if slightly verbose.
Implementing that is actually not particularly difficult, I have a patch attached for comment.The patch may require some slight cleanups, but it works. I also have some test cases on my system I can cleanup and send if people like this extension.
I think that I could probably generate some better warnings for misuses of the pragma, though what those warnings are depends on what the exact extensions are, so if people are happy with the my proposed extension I may go through and expand on those.
Louis
pushable_diagnostics.patch (6.19 KB)