public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
From: Michael Marks <Michael.Marks@internetmachines.com>
To: nobody@gcc.gnu.org
Cc: gcc-prs@gcc.gnu.org,
Subject: RE: c/10226: unsigned short promotion with bitwise inversion
Date: Wed, 26 Mar 2003 21:16:00 -0000	[thread overview]
Message-ID: <20030326211600.15782.qmail@sources.redhat.com> (raw)

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--


             reply	other threads:[~2003-03-26 21:16 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-03-26 21:16 Michael Marks [this message]
  -- 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 Glen Nakamura
2003-03-26 21:56 Falk Hueffner
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20030326211600.15782.qmail@sources.redhat.com \
    --to=michael.marks@internetmachines.com \
    --cc=gcc-prs@gcc.gnu.org \
    --cc=nobody@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).