[cfe-dev] -Wsign-compare warns on different signs of operands for ?:

John McCall rjmccall at apple.com
Thu Jul 14 13:11:17 PDT 2011


On Jul 14, 2011, at 12:58 PM, Richard Trieu wrote:

> On Wed, Jul 13, 2011 at 10:08 PM, John McCall <rjmccall at apple.com> wrote:
> 
> On Jul 13, 2011, at 5:15 PM, Richard Trieu wrote:
> 
> > For code such as:
> >
> > void f(unsigned int u, int i) {
> >   (void) (true ? u : i);
> > }
> >
> > When run with -Wsign-compare, Clang gives the following warning.
> >
> > warning: operands of ? are integers of different signs:
> >       'unsigned int' and 'int' [-Wsign-compare]
> >   (void) (true ? u : i);
> >                ^ ~   ~
> >
> > Yet, no comparison is going on between u and i, so the warning seems out of place for grouping with -Wsign-compare.  I think that it would be better is this warning was pulled out of the -Wsign-compare diagnostic group.  Also, gcc's -Wsign-compare does not warn on this code, so this change will make Clang's sign compare closer to gcc's.  Does this seem reasonable?
> 
> gcc's -Wsign-compare does warn on this code if you make the condition non-trivial.  Clang is just missing that special case.
> 
> John.
> 
> Could you give an example of a non-trivial case that gcc does warn on?  I've tried:
> 
> void f(bool b, unsigned int u, int i) {
>   (void) (b ? u : i);
> }
> 
> void f(unsigned int u, int i) {
>   (void) ((i > 5) ? u : i);
> }
> 
> but both don't give an warning from gcc -Wsign-compare.  Clang's -Wsign-compare warns on both.

Aha.  From 'bool' I take it that you're talking about C++.  You're correct that G++'s -Wsign-compare does not warn about conditional operators.  GCC's does.  In clang, we decided that that inconsistency wasn't worth emulating.

John.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110714/0bc588d7/attachment.html>


More information about the cfe-dev mailing list