On Thu, Jul 13, 2017 at 04:59:20PM -0400, David Malcolm wrote: > On Thu, 2017-07-13 at 16:39 -0400, Eric Gallager wrote: > > On 7/13/17, David Malcolm <dmalc...@redhat.com> wrote: > > > On Thu, 2017-07-13 at 18:33 +0200, Marek Polacek wrote: > > > > A tiny patch for -Wsign-compare so that is also prints the types > > > > when > > > > reporting a warning. > > > > > > > > Bootstrapped/regtested on x86_64-linux and ppc64le-redhat-linux, > > > > ok > > > > for trunk? > > > > > > Looks like it always display the types in the order signed then > > > unsigned, which matches the text of the diagnostic, but not > > > necessarily > > > the ordering within the expression, which might be confusing if > > > someone's comparing e.g. > > > > > > unsigned_a < signed_b > > > > > > > Good catch, I forgot about that case when opening the original bug > > that Marek posted this patch for... > > > > > But we already hardcode the ordering within the text of the > > > diagnostic, > > > so that feels excessively nit-picky. > > > > I don't think it's being excessively nit-picky; I think it'd make > > more > > sense to match the ordering of the expression. That's what clang > > does: > > > > $ cat Wsign_compare.c > > /* { dg-do compile } */ > > > > int foo(signed int a, unsigned int b) > > { > > return (a < b); > > } > > > > int bar(unsigned int c, signed int d) > > { > > return (c < d); > > } > > > > $ /sw/opt/llvm-3.1/bin/clang -c -Wsign-compare Wsign_compare.c > > Wsign_compare.c:5:12: warning: comparison of integers of different > > signs: 'int' and 'unsigned int' [-Wsign-compare] > > return (a < b); > > ~ ^ ~ > > Wsign_compare.c:10:12: warning: comparison of integers of different > > signs: 'unsigned int' and 'int' [-Wsign-compare] > > return (c < d); > > ~ ^ ~ > > 2 warnings generated. > > That's much nicer. > > > > > > > > > OK for trunk (with my "diagnostic messages" maintainer hat on). > > Marek: I take it back; can you update the patch accordingly, please? > > (Note to self: always doublecheck the linked PR for context).
Sure, here goes: Bootstrapped/regtested on x86_64-linux, ok for trunk? 2017-07-14 Marek Polacek <pola...@redhat.com> PR c/81417 * c-warn.c (warn_for_sign_compare): Print the types. * c-c++-common/Wsign-compare-1.c: New test. diff --git gcc/c-family/c-warn.c gcc/c-family/c-warn.c index b9378c2dbe2..7ff11821453 100644 --- gcc/c-family/c-warn.c +++ gcc/c-family/c-warn.c @@ -1891,9 +1891,10 @@ warn_for_sign_compare (location_t location, c_common_signed_type (base_type))) /* OK */; else - warning_at (location, - OPT_Wsign_compare, - "comparison between signed and unsigned integer expressions"); + warning_at (location, OPT_Wsign_compare, + "comparison between signed and unsigned integer " + "expressions: %qT and %qT", TREE_TYPE (orig_op0), + TREE_TYPE (orig_op1)); } /* Warn if two unsigned values are being compared in a size larger diff --git gcc/testsuite/c-c++-common/Wsign-compare-1.c gcc/testsuite/c-c++-common/Wsign-compare-1.c index e69de29bb2d..0e01453e7d8 100644 --- gcc/testsuite/c-c++-common/Wsign-compare-1.c +++ gcc/testsuite/c-c++-common/Wsign-compare-1.c @@ -0,0 +1,27 @@ +/* PR c/81417 */ +/* { dg-do compile } */ +/* { dg-options "-Wsign-compare" } */ + +int +fn1 (signed int a, unsigned int b) +{ + return a < b; /* { dg-warning "comparison between signed and unsigned integer expressions: 'int' and 'unsigned int'" } */ +} + +int +fn2 (signed int a, unsigned int b) +{ + return b < a; /* { dg-warning "comparison between signed and unsigned integer expressions: 'unsigned int' and 'int'" } */ +} + +int +fn3 (signed long int a, unsigned long int b) +{ + return b < a; /* { dg-warning "comparison between signed and unsigned integer expressions: 'long unsigned int' and 'long int'" } */ +} + +int +fn4 (signed short int a, unsigned int b) +{ + return b < a; /* { dg-warning "comparison between signed and unsigned integer expressions: 'unsigned int' and 'short int'" } */ +} Marek