[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