public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* RE: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 21:16 Michael Marks
0 siblings, 0 replies; 14+ messages in thread
From: Michael Marks @ 2003-03-26 21:16 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Michael Marks <Michael.Marks@internetmachines.com>
To: 'Glen Nakamura' <glen@imodulo.com>, gcc-gnats@gcc.gnu.org,
"'falk.hueffner@student.uni-tuebingen.de'"
<falk.hueffner@student.uni-tuebingen.de>
Cc:
Subject: RE: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 13:08:47 -0800
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
------_=_NextPart_001_01C2F3DB.E49BAC30
Content-Type: text/plain;
charset="iso-8859-1"
Thanks, I had worked around it before I sent the report in...
In fact your suggestion is the workaround I chose.
I logged it because it did not seem to be regular to promote two like sized
variables,
especially because a bitwise inversion will always cause the failure.
Any clue as to why the spec reads that way... we speculated that it is for
32 bit optimizations, but did not come up with anything better than that.
Thanks to all of you for the quick response. I think that the warning
misleads
because it says ~unsigned to unsigned... correctly should be short unsigned
to int.
At least I think so.
From another response earlier....
----
Actually I understood that the warning was tied to that error.
I would suggest:
warning : ~ operator caused promotion of unsigned short to int
Interestingly: Sun CC passes and Microsoft Fails without warning.
Michael.
Apparently, you didn't understand the warning. The C standard mandates
that "~A" will promote A to int first. So gcc is behaving correctly
here. Any suggestions on how the wording of the message could be
improved to be clearer?
--
Falk
-----Original Message-----
From: Glen Nakamura [mailto:glen@imodulo.com]
Sent: Wednesday, March 26, 2003 12:06 PM
To: gcc-gnats@gcc.gnu.org; gcc-bugs@gcc.gnu.org;
mmarks@internetmachines.com
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&p
r=10226
> unsigned short A = 0xDEAD;
> unsigned short B;
> B = ~A;
> if ( B == ~A) {
> printf("Pass\n");
> }
> else {
> printf("Fail\n");
> }
I'll leave the final decision to the language lawyers, but I don't think
this is a bug in GCC. The ~ operator is subject to integer promotion,
so with the implicit conversions the expression becomes:
if ((int) B == ~((int) A))
which is indeed false in the example above.
In fact, I see the following warning when compiling with -Wall (GCC 3.3):
warning: comparison of promoted ~unsigned with unsigned
Perhaps "if (B == (unsigned short) ~A)" will behave as you expect.
- glen
------_=_NextPart_001_01C2F3DB.E49BAC30
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
charset=3Diso-8859-1">
<META NAME=3D"Generator" CONTENT=3D"MS Exchange Server version =
5.5.2653.12">
<TITLE>RE: c/10226: unsigned short promotion with bitwise =
inversion</TITLE>
</HEAD>
<BODY>
<P><FONT SIZE=3D2>Thanks, I had worked around it before I sent the =
report in... </FONT>
<BR><FONT SIZE=3D2>In fact your suggestion is the workaround I =
chose.</FONT>
<BR><FONT SIZE=3D2>I logged it because it did not seem to be regular to =
promote two like sized variables,</FONT>
<BR><FONT SIZE=3D2>especially because a bitwise inversion will always =
cause the failure.</FONT>
<BR><FONT SIZE=3D2>Any clue as to why the spec reads that way... we =
speculated that it is for</FONT>
<BR><FONT SIZE=3D2>32 bit optimizations, but did not come up with =
anything better than that.</FONT>
</P>
<P><FONT SIZE=3D2>Thanks to all of you for the quick response. I =
think that the warning misleads</FONT>
<BR><FONT SIZE=3D2>because it says ~unsigned to unsigned... correctly =
should be short unsigned to int.</FONT>
<BR><FONT SIZE=3D2>At least I think so.</FONT>
</P>
<P><FONT SIZE=3D2>From another response earlier....</FONT>
<BR><FONT SIZE=3D2>----</FONT>
</P>
<P><FONT SIZE=3D2>Actually I understood that the warning was tied to =
that error.</FONT>
</P>
<P><FONT SIZE=3D2>I would suggest:</FONT>
<BR><FONT SIZE=3D2>warning : ~ operator caused promotion of unsigned =
short to int</FONT>
</P>
<P><FONT SIZE=3D2>Interestingly: Sun CC passes and Microsoft Fails =
without warning.</FONT>
</P>
<P><FONT SIZE=3D2>Michael.</FONT>
</P>
<P><FONT SIZE=3D2>Apparently, you didn't understand the warning. The C =
standard mandates</FONT>
<BR><FONT SIZE=3D2>that "~A" will promote A to int first. So =
gcc is behaving correctly</FONT>
<BR><FONT SIZE=3D2>here. Any suggestions on how the wording of the =
message could be</FONT>
<BR><FONT SIZE=3D2>improved to be clearer?</FONT>
</P>
<P><FONT SIZE=3D2>-- </FONT>
<BR> <FONT =
SIZE=3D2>Falk</FONT>
</P>
<P><FONT SIZE=3D2>-----Original Message-----</FONT>
<BR><FONT SIZE=3D2>From: Glen Nakamura [<A =
HREF=3D"mailto:glen@imodulo.com">mailto:glen@imodulo.com</A>]</FONT>
<BR><FONT SIZE=3D2>Sent: Wednesday, March 26, 2003 12:06 PM</FONT>
<BR><FONT SIZE=3D2>To: gcc-gnats@gcc.gnu.org; =
gcc-bugs@gcc.gnu.org;</FONT>
<BR><FONT SIZE=3D2>mmarks@internetmachines.com</FONT>
<BR><FONT SIZE=3D2>Subject: Re: c/10226: unsigned short promotion with =
bitwise inversion</FONT>
</P>
<BR>
<P><FONT SIZE=3D2><A =
HREF=3D"http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=3Dview%20audit-trail&=
database=3Dgcc&pr=3D10226" =
TARGET=3D"_blank">http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=3Dview%20au=
dit-trail&database=3Dgcc&pr=3D10226</A></FONT>
<BR><FONT SIZE=3D2>> unsigned short A =3D 0xDEAD;</FONT>
<BR><FONT SIZE=3D2>> unsigned short B;</FONT>
<BR><FONT SIZE=3D2>> B =3D ~A;</FONT>
<BR><FONT SIZE=3D2>> if ( B =3D=3D ~A) {</FONT>
<BR><FONT SIZE=3D2>> =
printf("Pass\n");</FONT>
<BR><FONT SIZE=3D2>> }</FONT>
<BR><FONT SIZE=3D2>> else {</FONT>
<BR><FONT SIZE=3D2>> =
printf("Fail\n");</FONT>
<BR><FONT SIZE=3D2>> }</FONT>
</P>
<P><FONT SIZE=3D2>I'll leave the final decision to the language =
lawyers, but I don't think</FONT>
<BR><FONT SIZE=3D2>this is a bug in GCC. The ~ operator is =
subject to integer promotion,</FONT>
<BR><FONT SIZE=3D2>so with the implicit conversions the expression =
becomes:</FONT>
<BR><FONT SIZE=3D2> if ((int) B =3D=3D ~((int) A))</FONT>
<BR><FONT SIZE=3D2>which is indeed false in the example above.</FONT>
</P>
<P><FONT SIZE=3D2>In fact, I see the following warning when compiling =
with -Wall (GCC 3.3):</FONT>
<BR><FONT SIZE=3D2>warning: comparison of promoted ~unsigned with =
unsigned</FONT>
</P>
<P><FONT SIZE=3D2>Perhaps "if (B =3D=3D (unsigned short) ~A)" =
will behave as you expect.</FONT>
</P>
<P><FONT SIZE=3D2>- glen</FONT>
</P>
</BODY>
</HTML>
------_=_NextPart_001_01C2F3DB.E49BAC30--
^ permalink raw reply [flat|nested] 14+ messages in thread
* RE: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-27 0:16 Michael Marks
0 siblings, 0 replies; 14+ messages in thread
From: Michael Marks @ 2003-03-27 0:16 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Michael Marks <Michael.Marks@internetmachines.com>
To: 'Falk Hueffner' <falk.hueffner@student.uni-tuebingen.de>,
Glen Nakamura <glen@imodulo.com>
Cc: gcc-gnats@gcc.gnu.org
Subject: RE: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 15:10:54 -0800
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
------_=_NextPart_001_01C2F3EC.F3696FC0
Content-Type: text/plain;
charset="iso-8859-1"
Guys,
How about...
warning: comparison will will promote to ~(unsigned) which will zero extend
before ~ operation
-----Original Message-----
From: Falk Hueffner [mailto:falk.hueffner@student.uni-tuebingen.de]
Sent: Wednesday, March 26, 2003 2:54 PM
To: Glen Nakamura
Cc: Michael Marks; gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Glen Nakamura <glen@imodulo.com> writes:
> On Wed, Mar 26, 2003 at 11:19:58PM +0100, Falk Hueffner wrote:
> > Glen Nakamura <glen@imodulo.com> writes:
> > > How about one of these:
> > > warning: comparison of promoted ~unsigned with unsigned is always
false
> > > warning: comparison of ~(promoted unsigned) with unsigned is always
false
> >
> > Yes, that makes it even clearer. I'd prefer the second variant. (BTW,
> > funny, the optimizer doesn't seem to realize it's always false...)
>
> It does on my system (GCC 3.3):
Well, yeah, it's simply constant folding there. What I meant is that
gcc doesn't optimize
int f(unsigned short a, unsigned short b) { return b == ~a; }
to
int f(unsigned short a, unsigned short b) { return 0; }
--
Falk
------_=_NextPart_001_01C2F3EC.F3696FC0
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
charset=3Diso-8859-1">
<META NAME=3D"Generator" CONTENT=3D"MS Exchange Server version =
5.5.2653.12">
<TITLE>RE: c/10226: unsigned short promotion with bitwise =
inversion</TITLE>
</HEAD>
<BODY>
<P><FONT SIZE=3D2>Guys,</FONT>
<BR><FONT SIZE=3D2>How about...</FONT>
<BR><FONT SIZE=3D2>warning: comparison will will promote to ~(unsigned) =
which will zero extend before ~ operation</FONT>
</P>
<P><FONT SIZE=3D2>-----Original Message-----</FONT>
<BR><FONT SIZE=3D2>From: Falk Hueffner [<A =
HREF=3D"mailto:falk.hueffner@student.uni-tuebingen.de">mailto:falk.hueff=
ner@student.uni-tuebingen.de</A>]</FONT>
<BR><FONT SIZE=3D2>Sent: Wednesday, March 26, 2003 2:54 PM</FONT>
<BR><FONT SIZE=3D2>To: Glen Nakamura</FONT>
<BR><FONT SIZE=3D2>Cc: Michael Marks; gcc-gnats@gcc.gnu.org</FONT>
<BR><FONT SIZE=3D2>Subject: Re: c/10226: unsigned short promotion with =
bitwise inversion</FONT>
</P>
<BR>
<P><FONT SIZE=3D2>Glen Nakamura <glen@imodulo.com> writes:</FONT>
</P>
<P><FONT SIZE=3D2>> On Wed, Mar 26, 2003 at 11:19:58PM +0100, Falk =
Hueffner wrote:</FONT>
<BR><FONT SIZE=3D2>> > Glen Nakamura <glen@imodulo.com> =
writes:</FONT>
<BR><FONT SIZE=3D2>> > > How about one of these:</FONT>
<BR><FONT SIZE=3D2>> > > warning: comparison of promoted =
~unsigned with unsigned is always false</FONT>
<BR><FONT SIZE=3D2>> > > warning: comparison of ~(promoted =
unsigned) with unsigned is always false</FONT>
<BR><FONT SIZE=3D2>> > </FONT>
<BR><FONT SIZE=3D2>> > Yes, that makes it even clearer. I'd =
prefer the second variant. (BTW,</FONT>
<BR><FONT SIZE=3D2>> > funny, the optimizer doesn't seem to =
realize it's always false...)</FONT>
<BR><FONT SIZE=3D2>> </FONT>
<BR><FONT SIZE=3D2>> It does on my system (GCC 3.3):</FONT>
</P>
<P><FONT SIZE=3D2>Well, yeah, it's simply constant folding there. What =
I meant is that</FONT>
<BR><FONT SIZE=3D2>gcc doesn't optimize</FONT>
</P>
<P><FONT SIZE=3D2>int f(unsigned short a, unsigned short b) { return b =
=3D=3D ~a; }</FONT>
</P>
<P><FONT SIZE=3D2>to</FONT>
</P>
<P><FONT SIZE=3D2>int f(unsigned short a, unsigned short b) { return 0; =
}</FONT>
</P>
<P><FONT SIZE=3D2>-- </FONT>
<BR> <FONT =
SIZE=3D2>Falk</FONT>
</P>
</BODY>
</HTML>
------_=_NextPart_001_01C2F3EC.F3696FC0--
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 23:06 Falk Hueffner
0 siblings, 0 replies; 14+ messages in thread
From: Falk Hueffner @ 2003-03-26 23:06 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
To: Glen Nakamura <glen@imodulo.com>
Cc: Michael Marks <Michael.Marks@internetmachines.com>, gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: 26 Mar 2003 23:53:41 +0100
Glen Nakamura <glen@imodulo.com> writes:
> On Wed, Mar 26, 2003 at 11:19:58PM +0100, Falk Hueffner wrote:
> > Glen Nakamura <glen@imodulo.com> writes:
> > > How about one of these:
> > > warning: comparison of promoted ~unsigned with unsigned is always false
> > > warning: comparison of ~(promoted unsigned) with unsigned is always false
> >
> > Yes, that makes it even clearer. I'd prefer the second variant. (BTW,
> > funny, the optimizer doesn't seem to realize it's always false...)
>
> It does on my system (GCC 3.3):
Well, yeah, it's simply constant folding there. What I meant is that
gcc doesn't optimize
int f(unsigned short a, unsigned short b) { return b == ~a; }
to
int f(unsigned short a, unsigned short b) { return 0; }
--
Falk
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 22:36 Glen Nakamura
0 siblings, 0 replies; 14+ messages in thread
From: Glen Nakamura @ 2003-03-26 22:36 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Glen Nakamura <glen@imodulo.com>
To: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
Cc: Michael Marks <Michael.Marks@internetmachines.com>,
gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 12:30:54 -1000
On Wed, Mar 26, 2003 at 11:19:58PM +0100, Falk Hueffner wrote:
> Glen Nakamura <glen@imodulo.com> writes:
> > How about one of these:
> > warning: comparison of promoted ~unsigned with unsigned is always false
> > warning: comparison of ~(promoted unsigned) with unsigned is always false
>
> Yes, that makes it even clearer. I'd prefer the second variant. (BTW,
> funny, the optimizer doesn't seem to realize it's always false...)
>
> --
> Falk
It does on my system (GCC 3.3):
.LC1:
.string "Fail"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $.LC1, (%esp)
call puts
movl %ebp, %esp
xorl %eax, %eax
popl %ebp
ret
But, as I mentioned before my suggestion won't work for other comparisons...
the warning probably needs to be generic enough for all of the following cases:
unsigned (char|short) (==|!=|<|<=|>|>=) ~unsigned (char|short)
which is *not* always false but could have unexpected results.
- glen
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 22:26 Glen Nakamura
0 siblings, 0 replies; 14+ messages in thread
From: Glen Nakamura @ 2003-03-26 22:26 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Glen Nakamura <glen@imodulo.com>
To: Michael Marks <Michael.Marks@internetmachines.com>
Cc: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>,
gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 12:13:33 -1000
On Wed, Mar 26, 2003 at 01:50:29PM -0800, Michael Marks wrote:
> Either is far clearer than the original.
> I like the second one better.
On second thought, my suggestions won't work for the other comparisons:
e.g. <= >= < > !=
I'm starting to see why it's worded the way it is...
> Just one other comment, are both promoted, and are both unsigned after the
> promotion.
> I thought they are promoted to int. As per you earlier...
>
> The ~ operator is subject to integer promotion,
> so with the implicit conversions the expression becomes:
> if ((int) B == ~((int) A))
> which is indeed false in the example above.
I think it is promoted to int, but that really doesn't matter since:
if ((unsigned int) B == ~((unsigned int) A))
would still be false.
The problem is widening an unsigned type and then doing a ~ operation,
forces the high bits to 1. In contrast, the other unsigned operand is just
widened so the high bits are guaranteed 0. Comparison of these two operands
can give unexpected results, which is what the warning is trying to illustrate.
- glen
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 22:26 Falk Hueffner
0 siblings, 0 replies; 14+ messages in thread
From: Falk Hueffner @ 2003-03-26 22:26 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
To: Glen Nakamura <glen@imodulo.com>
Cc: Michael Marks <Michael.Marks@internetmachines.com>, gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: 26 Mar 2003 23:19:58 +0100
Glen Nakamura <glen@imodulo.com> writes:
> On Wed, Mar 26, 2003 at 10:39:43PM +0100, Falk Hueffner wrote:
> > Indeed. Currently, it says:
> > warning: comparison of promoted ~unsigned with unsigned
> > Suggestion:
> > warning: comparison of ~(promoted unsigned) with unsigned
>
> How about one of these:
> warning: comparison of promoted ~unsigned with unsigned is always false
> warning: comparison of ~(promoted unsigned) with unsigned is always false
Yes, that makes it even clearer. I'd prefer the second variant. (BTW,
funny, the optimizer doesn't seem to realize it's always false...)
--
Falk
^ permalink raw reply [flat|nested] 14+ messages in thread
* RE: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 22:06 Michael Marks
0 siblings, 0 replies; 14+ messages in thread
From: Michael Marks @ 2003-03-26 22:06 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Michael Marks <Michael.Marks@internetmachines.com>
To: 'Glen Nakamura' <glen@imodulo.com>, Falk Hueffner
<falk.hueffner@student.uni-tuebingen.de>
Cc: Michael Marks <Michael.Marks@internetmachines.com>,
gcc-gnats@gcc.gnu.org
Subject: RE: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 13:50:29 -0800
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
------_=_NextPart_001_01C2F3E1.B7E36740
Content-Type: text/plain;
charset="iso-8859-1"
Either is far clearer than the original.
I like the second one better.
Just one other comment, are both promoted, and are both unsigned after the
promotion.
I thought they are promoted to int. As per you earlier...
The ~ operator is subject to integer promotion,
so with the implicit conversions the expression becomes:
if ((int) B == ~((int) A))
which is indeed false in the example above.
But like I said earlier, either message below is far clearer.
Thanks,
Michael.
-----Original Message-----
From: Glen Nakamura [mailto:glen@imodulo.com]
Sent: Wednesday, March 26, 2003 1:49 PM
To: Falk Hueffner
Cc: Michael Marks; gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
On Wed, Mar 26, 2003 at 10:39:43PM +0100, Falk Hueffner wrote:
> Indeed. Currently, it says:
> warning: comparison of promoted ~unsigned with unsigned
> Suggestion:
> warning: comparison of ~(promoted unsigned) with unsigned
How about one of these:
warning: comparison of promoted ~unsigned with unsigned is always false
warning: comparison of ~(promoted unsigned) with unsigned is always false
- glen
------_=_NextPart_001_01C2F3E1.B7E36740
Content-Type: text/html;
charset="iso-8859-1"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2653.12">
<TITLE>RE: c/10226: unsigned short promotion with bitwise inversion</TITLE>
</HEAD>
<BODY>
<P><FONT SIZE=2>Either is far clearer than the original. </FONT>
<BR><FONT SIZE=2>I like the second one better.</FONT>
</P>
<P><FONT SIZE=2>Just one other comment, are both promoted, and are both unsigned after the promotion.</FONT>
<BR><FONT SIZE=2>I thought they are promoted to int. As per you earlier...</FONT>
</P>
<P><FONT SIZE=2>The ~ operator is subject to integer promotion,</FONT>
<BR><FONT SIZE=2>so with the implicit conversions the expression becomes:</FONT>
<BR><FONT SIZE=2> if ((int) B == ~((int) A))</FONT>
<BR><FONT SIZE=2>which is indeed false in the example above.</FONT>
</P>
<P><FONT SIZE=2>But like I said earlier, either message below is far clearer.</FONT>
</P>
<P><FONT SIZE=2>Thanks,</FONT>
<BR><FONT SIZE=2>Michael.</FONT>
</P>
<P><FONT SIZE=2>-----Original Message-----</FONT>
<BR><FONT SIZE=2>From: Glen Nakamura [<A HREF="mailto:glen@imodulo.com">mailto:glen@imodulo.com</A>]</FONT>
<BR><FONT SIZE=2>Sent: Wednesday, March 26, 2003 1:49 PM</FONT>
<BR><FONT SIZE=2>To: Falk Hueffner</FONT>
<BR><FONT SIZE=2>Cc: Michael Marks; gcc-gnats@gcc.gnu.org</FONT>
<BR><FONT SIZE=2>Subject: Re: c/10226: unsigned short promotion with bitwise inversion</FONT>
</P>
<BR>
<P><FONT SIZE=2>On Wed, Mar 26, 2003 at 10:39:43PM +0100, Falk Hueffner wrote:</FONT>
<BR><FONT SIZE=2>> Indeed. Currently, it says:</FONT>
<BR><FONT SIZE=2>> warning: comparison of promoted ~unsigned with unsigned</FONT>
<BR><FONT SIZE=2>> Suggestion:</FONT>
<BR><FONT SIZE=2>> warning: comparison of ~(promoted unsigned) with unsigned</FONT>
</P>
<P><FONT SIZE=2>How about one of these:</FONT>
<BR><FONT SIZE=2>warning: comparison of promoted ~unsigned with unsigned is always false</FONT>
<BR><FONT SIZE=2>warning: comparison of ~(promoted unsigned) with unsigned is always false</FONT>
</P>
<P><FONT SIZE=2>- glen</FONT>
</P>
</BODY>
</HTML>
------_=_NextPart_001_01C2F3E1.B7E36740--
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 21:56 Falk Hueffner
0 siblings, 0 replies; 14+ messages in thread
From: Falk Hueffner @ 2003-03-26 21:56 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
To: Michael Marks <Michael.Marks@internetmachines.com>
Cc: "'Glen Nakamura'" <glen@imodulo.com>, gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: 26 Mar 2003 22:39:43 +0100
Michael Marks <Michael.Marks@internetmachines.com> writes:
> Thanks to all of you for the quick response. I think that the
> warning misleads because it says ~unsigned to unsigned... correctly
> should be short unsigned to int. At least I think so.
Indeed. Currently, it says:
warning: comparison of promoted ~unsigned with unsigned
Suggestion:
warning: comparison of ~(promoted unsigned) with unsigned
--
Falk
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 21:56 Glen Nakamura
0 siblings, 0 replies; 14+ messages in thread
From: Glen Nakamura @ 2003-03-26 21:56 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Glen Nakamura <glen@imodulo.com>
To: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
Cc: Michael Marks <Michael.Marks@internetmachines.com>,
gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 11:49:07 -1000
On Wed, Mar 26, 2003 at 10:39:43PM +0100, Falk Hueffner wrote:
> Indeed. Currently, it says:
> warning: comparison of promoted ~unsigned with unsigned
> Suggestion:
> warning: comparison of ~(promoted unsigned) with unsigned
How about one of these:
warning: comparison of promoted ~unsigned with unsigned is always false
warning: comparison of ~(promoted unsigned) with unsigned is always false
- glen
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 21:16 ebotcazou
0 siblings, 0 replies; 14+ messages in thread
From: ebotcazou @ 2003-03-26 21:16 UTC (permalink / raw)
To: gcc-bugs, gcc-prs, mmarks, nobody
Synopsis: unsigned short promotion with bitwise inversion
State-Changed-From-To: open->closed
State-Changed-By: ebotcazou
State-Changed-When: Wed Mar 26 21:01:46 2003
State-Changed-Why:
Not a bug.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=10226
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 20:36 Glen Nakamura
0 siblings, 0 replies; 14+ messages in thread
From: Glen Nakamura @ 2003-03-26 20:36 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Glen Nakamura <glen@imodulo.com>
To: gcc-gnats@gcc.gnu.org, gcc-bugs@gcc.gnu.org,
mmarks@internetmachines.com
Cc:
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 10:06:02 -1000
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=10226
> unsigned short A = 0xDEAD;
> unsigned short B;
> B = ~A;
> if ( B == ~A) {
> printf("Pass\n");
> }
> else {
> printf("Fail\n");
> }
I'll leave the final decision to the language lawyers, but I don't think
this is a bug in GCC. The ~ operator is subject to integer promotion,
so with the implicit conversions the expression becomes:
if ((int) B == ~((int) A))
which is indeed false in the example above.
In fact, I see the following warning when compiling with -Wall (GCC 3.3):
warning: comparison of promoted ~unsigned with unsigned
Perhaps "if (B == (unsigned short) ~A)" will behave as you expect.
- glen
^ permalink raw reply [flat|nested] 14+ messages in thread
* RE: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 19:56 Michael Marks
0 siblings, 0 replies; 14+ messages in thread
From: Michael Marks @ 2003-03-26 19:56 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Michael Marks <Michael.Marks@internetmachines.com>
To: 'Falk Hueffner' <falk.hueffner@student.uni-tuebingen.de>
Cc: gcc-gnats@gcc.gnu.org
Subject: RE: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 11:27:06 -0800
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
------_=_NextPart_001_01C2F3CD.AFA9C7E0
Content-Type: text/plain;
charset="iso-8859-1"
Actually I understood that the warning was tied to that error.
I would suggest:
warning : ~ operator caused promotion of unsigned short to int
Interestingly: Sun CC passes and Microsoft Fails without warning.
Michael.
-----Original Message-----
From: Falk Hueffner [mailto:falk.hueffner@student.uni-tuebingen.de]
Sent: Wednesday, March 26, 2003 10:23 AM
To: mmarks@internetmachines.com
Cc: gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
mmarks@internetmachines.com writes:
> When two unsigned shorts (16 bit) variables are compared with one being
inverted the comparison will fail.
> The following code should pass, while it does generate a warning it
> should instead just work.
>
> unsigned short A = 0xDEAD;
> unsigned short B;
> B = ~A;
> if ( B == ~A) {
> printf("Pass\n");
> }
> else {
> printf("Fail\n");
> }
Apparently, you didn't understand the warning. The C standard mandates
that "~A" will promote A to int first. So gcc is behaving correctly
here. Any suggestions on how the wording of the message could be
improved to be clearer?
--
Falk
------_=_NextPart_001_01C2F3CD.AFA9C7E0
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
charset=3Diso-8859-1">
<META NAME=3D"Generator" CONTENT=3D"MS Exchange Server version =
5.5.2653.12">
<TITLE>RE: c/10226: unsigned short promotion with bitwise =
inversion</TITLE>
</HEAD>
<BODY>
<P><FONT SIZE=3D2>Actually I understood that the warning was tied to =
that error.</FONT>
</P>
<P><FONT SIZE=3D2>I would suggest:</FONT>
<BR><FONT SIZE=3D2>warning : ~ operator caused promotion of unsigned =
short to int</FONT>
</P>
<P><FONT SIZE=3D2>Interestingly: Sun CC passes and Microsoft Fails =
without warning.</FONT>
</P>
<P><FONT SIZE=3D2>Michael.</FONT>
</P>
<P><FONT SIZE=3D2>-----Original Message-----</FONT>
<BR><FONT SIZE=3D2>From: Falk Hueffner [<A =
HREF=3D"mailto:falk.hueffner@student.uni-tuebingen.de">mailto:falk.hueff=
ner@student.uni-tuebingen.de</A>]</FONT>
<BR><FONT SIZE=3D2>Sent: Wednesday, March 26, 2003 10:23 AM</FONT>
<BR><FONT SIZE=3D2>To: mmarks@internetmachines.com</FONT>
<BR><FONT SIZE=3D2>Cc: gcc-gnats@gcc.gnu.org</FONT>
<BR><FONT SIZE=3D2>Subject: Re: c/10226: unsigned short promotion with =
bitwise inversion</FONT>
</P>
<BR>
<P><FONT SIZE=3D2>mmarks@internetmachines.com writes:</FONT>
</P>
<P><FONT SIZE=3D2>> When two unsigned shorts (16 bit) variables are =
compared with one being inverted the comparison will fail.</FONT>
<BR><FONT SIZE=3D2>> The following code should pass, while it does =
generate a warning it</FONT>
<BR><FONT SIZE=3D2>> should instead just work.</FONT>
<BR><FONT SIZE=3D2>> </FONT>
<BR><FONT SIZE=3D2>> unsigned short A =3D =
0xDEAD;</FONT>
<BR><FONT SIZE=3D2>> unsigned short B;</FONT>
<BR><FONT SIZE=3D2>> B =3D ~A;</FONT>
<BR><FONT SIZE=3D2>> if ( B =3D=3D ~A) {</FONT>
<BR><FONT SIZE=3D2>> =
printf("Pass\n");</FONT>
<BR><FONT SIZE=3D2>> }</FONT>
<BR><FONT SIZE=3D2>> else {</FONT>
<BR><FONT SIZE=3D2>> =
printf("Fail\n");</FONT>
<BR><FONT SIZE=3D2>> }</FONT>
</P>
<P><FONT SIZE=3D2>Apparently, you didn't understand the warning. The C =
standard mandates</FONT>
<BR><FONT SIZE=3D2>that "~A" will promote A to int first. So =
gcc is behaving correctly</FONT>
<BR><FONT SIZE=3D2>here. Any suggestions on how the wording of the =
message could be</FONT>
<BR><FONT SIZE=3D2>improved to be clearer?</FONT>
</P>
<P><FONT SIZE=3D2>-- </FONT>
<BR> <FONT =
SIZE=3D2>Falk</FONT>
</P>
</BODY>
</HTML>
------_=_NextPart_001_01C2F3CD.AFA9C7E0--
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 18:26 Falk Hueffner
0 siblings, 0 replies; 14+ messages in thread
From: Falk Hueffner @ 2003-03-26 18:26 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR c/10226; it has been noted by GNATS.
From: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
To: mmarks@internetmachines.com
Cc: gcc-gnats@gcc.gnu.org
Subject: Re: c/10226: unsigned short promotion with bitwise inversion
Date: 26 Mar 2003 19:23:10 +0100
mmarks@internetmachines.com writes:
> When two unsigned shorts (16 bit) variables are compared with one being inverted the comparison will fail.
> The following code should pass, while it does generate a warning it
> should instead just work.
>
> unsigned short A = 0xDEAD;
> unsigned short B;
> B = ~A;
> if ( B == ~A) {
> printf("Pass\n");
> }
> else {
> printf("Fail\n");
> }
Apparently, you didn't understand the warning. The C standard mandates
that "~A" will promote A to int first. So gcc is behaving correctly
here. Any suggestions on how the wording of the message could be
improved to be clearer?
--
Falk
^ permalink raw reply [flat|nested] 14+ messages in thread
* c/10226: unsigned short promotion with bitwise inversion
@ 2003-03-26 18:16 mmarks
0 siblings, 0 replies; 14+ messages in thread
From: mmarks @ 2003-03-26 18:16 UTC (permalink / raw)
To: gcc-gnats
>Number: 10226
>Category: c
>Synopsis: unsigned short promotion with bitwise inversion
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Mar 26 18:06:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator: mmarks@internetmachines.com
>Release: unknown-1.0
>Organization:
>Environment:
gcc 3.2.1 and 3.2.2
>Description:
When two unsigned shorts (16 bit) variables are compared with one being inverted the comparison will fail.
The following code should pass, while it does generate a warning it should instead just work.
unsigned short A = 0xDEAD;
unsigned short B;
B = ~A;
if ( B == ~A) {
printf("Pass\n");
}
else {
printf("Fail\n");
}
It compares 0xFFFFDEAD == 0x0000DEAD which fails
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2003-03-26 23:16 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-26 21:16 c/10226: unsigned short promotion with bitwise inversion Michael Marks
-- strict thread matches above, loose matches on Subject: below --
2003-03-27 0:16 Michael Marks
2003-03-26 23:06 Falk Hueffner
2003-03-26 22:36 Glen Nakamura
2003-03-26 22:26 Glen Nakamura
2003-03-26 22:26 Falk Hueffner
2003-03-26 22:06 Michael Marks
2003-03-26 21:56 Falk Hueffner
2003-03-26 21:56 Glen Nakamura
2003-03-26 21:16 ebotcazou
2003-03-26 20:36 Glen Nakamura
2003-03-26 19:56 Michael Marks
2003-03-26 18:26 Falk Hueffner
2003-03-26 18:16 mmarks
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).