This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: c-family PATCH to improve -Wsign-compare (PR c/81417)
- From: Marek Polacek <polacek at redhat dot com>
- To: David Malcolm <dmalcolm at redhat dot com>
- Cc: Eric Gallager <egall at gwmail dot gwu dot edu>, GCC Patches <gcc-patches at gcc dot gnu dot org>, Joseph Myers <joseph at codesourcery dot com>
- Date: Tue, 25 Jul 2017 11:45:53 +0200
- Subject: Re: c-family PATCH to improve -Wsign-compare (PR c/81417)
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=polacek at redhat dot com
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 02AA97DCC4
- References: <20170713163349.GE2890@redhat.com> <1499976221.7593.6.camel@redhat.com> <CAMfHzOvC2THBoKs4042ZvDBFZd1UhWFT75mSJj=cqWx4mUkrBg@mail.gmail.com> <1499979560.7593.9.camel@redhat.com> <20170714132721.GI2890@redhat.com>
Ping.
On Fri, Jul 14, 2017 at 03:27:21PM +0200, Marek Polacek wrote:
> 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 <dmalcolm@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 <polacek@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