public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* 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 &lt;glen@imodulo.com&gt; writes:</FONT>
 </P>
 
 <P><FONT SIZE=3D2>&gt; On Wed, Mar 26, 2003 at 11:19:58PM +0100, Falk =
 Hueffner wrote:</FONT>
 <BR><FONT SIZE=3D2>&gt; &gt; Glen Nakamura &lt;glen@imodulo.com&gt; =
 writes:</FONT>
 <BR><FONT SIZE=3D2>&gt; &gt; &gt; How about one of these:</FONT>
 <BR><FONT SIZE=3D2>&gt; &gt; &gt; warning: comparison of promoted =
 ~unsigned with unsigned is always false</FONT>
 <BR><FONT SIZE=3D2>&gt; &gt; &gt; warning: comparison of ~(promoted =
 unsigned) with unsigned is always false</FONT>
 <BR><FONT SIZE=3D2>&gt; &gt; </FONT>
 <BR><FONT SIZE=3D2>&gt; &gt; Yes, that makes it even clearer. I'd =
 prefer the second variant.&nbsp; (BTW,</FONT>
 <BR><FONT SIZE=3D2>&gt; &gt; funny, the optimizer doesn't seem to =
 realize it's always false...)</FONT>
 <BR><FONT SIZE=3D2>&gt; </FONT>
 <BR><FONT SIZE=3D2>&gt; 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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.&nbsp; </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>&nbsp; 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>&gt; Indeed. Currently, it says:</FONT>
 <BR><FONT SIZE=2>&gt; warning: comparison of promoted ~unsigned with unsigned</FONT>
 <BR><FONT SIZE=2>&gt; Suggestion:</FONT>
 <BR><FONT SIZE=2>&gt; 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 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.&nbsp; 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 &quot;~A&quot; 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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>&gt; unsigned short A =3D 0xDEAD;</FONT>
 <BR><FONT SIZE=3D2>&gt; unsigned short B;</FONT>
 <BR><FONT SIZE=3D2>&gt; B =3D ~A;</FONT>
 <BR><FONT SIZE=3D2>&gt; if ( B =3D=3D ~A) {</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; =
 printf(&quot;Pass\n&quot;);</FONT>
 <BR><FONT SIZE=3D2>&gt; }</FONT>
 <BR><FONT SIZE=3D2>&gt; else {</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; =
 printf(&quot;Fail\n&quot;);</FONT>
 <BR><FONT SIZE=3D2>&gt; }</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.&nbsp; 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>&nbsp; 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 &quot;if (B =3D=3D (unsigned short) ~A)&quot; =
 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-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>&gt; When two unsigned shorts (16 bit) variables are =
 compared with one being inverted the comparison will fail.</FONT>
 <BR><FONT SIZE=3D2>&gt; The following code should pass, while it does =
 generate a warning it</FONT>
 <BR><FONT SIZE=3D2>&gt; should instead just work.</FONT>
 <BR><FONT SIZE=3D2>&gt; </FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; unsigned short A =3D =
 0xDEAD;</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; unsigned short B;</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; B =3D ~A;</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; if ( B =3D=3D ~A) {</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
 printf(&quot;Pass\n&quot;);</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; }</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; else {</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
 printf(&quot;Fail\n&quot;);</FONT>
 <BR><FONT SIZE=3D2>&gt;&nbsp;&nbsp;&nbsp; }</FONT>
 </P>
 
 <P><FONT SIZE=3D2>Apparently, you didn't understand the warning. The C =
 standard mandates</FONT>
 <BR><FONT SIZE=3D2>that &quot;~A&quot; 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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-27  0:16 c/10226: unsigned short promotion with bitwise inversion Michael Marks
  -- strict thread matches above, loose matches on Subject: below --
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 21:16 Michael Marks
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).