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

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


On Jul 14, 2011, at 4:57 PM, Richard Trieu wrote:
> On Thu, Jul 14, 2011 at 1:39 PM, John McCall <rjmccall at apple.com> wrote:
> On Jul 14, 2011, at 1:32 PM, Richard Trieu wrote:
>> On Thu, Jul 14, 2011 at 1:11 PM, John McCall <rjmccall at apple.com> wrote:
>> 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.
>> 
>> Sorry for the confusion.  If we don't care about consistency in this case, can we remove this warning so that our -Wsign-compare will only be about signed comparisons?
> 
> I have no problem with that;  just don't tell me it's about consistency with what GCC does. :)
> 
> John.
> 
> Originally, I was going to move this warning (operands of different signs) out to its own flag.  However, a similar warning (? operand conversion) exists in -Wsign-conversion which will warn on the same case as this warning (operands of different signs) does.  Since this case is covered under (? operand conversion), should this warning (operands of different signs) be completely removed from Clang?

I think that was just a hack so that it would appear under both flags.

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


More information about the cfe-dev mailing list