[cfe-dev] Pushable #pragma diagnostics

Louis Gerbarg lgerbarg at gmail.com
Sun Jul 5 14:42:27 PDT 2009

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  

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.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: pushable_diagnostics.patch
Type: application/octet-stream
Size: 6334 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20090705/31351b33/attachment.obj>

More information about the cfe-dev mailing list