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 But we already hardcode the ordering within the text of the diagnostic, so that feels excessively nit-picky. OK for trunk (with my "diagnostic messages" maintainer hat on). Thanks Dave > 2017-07-13 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..c903c080a33 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 (sop), > + TREE_TYPE (uop)); > } > > /* 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..e53f87aa9a3 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: 'int' and 'unsigned int'" } */ > +} > + > +int > +fn3 (signed long int a, unsigned long int b) > +{ > + return b < a; /* { dg-warning "comparison between signed and > unsigned integer expressions: 'long int' and 'long unsigned int'" } > */ > +} > + > +int > +fn4 (signed short int a, unsigned int b) > +{ > + return b < a; /* { dg-warning "comparison between signed and > unsigned integer expressions: 'short int' and 'unsigned int'" } */ > +} > > Marek