call to revolt

Tim McDaniel mcdaniel at adi.com
Fri Jun 28 01:07:01 AEST 1991


Oh, dear.  I had thought this horse had fossilized by now.

In article <4880 at inews.intel.com> bhoughto at bishop.intel.com (Blair P.
Houghton) writes:

   This'll do it, too:

           thing += (int *)1;

   (see ANSI X3.159-1989, sec. 3.3.16.2, p. 55, ll. 20-21, and
   footnote 51 at the bottom of p. 51, for proof...)

In the ANSI-published version, footnote 51 is at the bottom of page
54, and deals with "the asymmetric appearance of these constraints
with respect to type qualifiers" in simple assignment, which means
"=".  It is therefore entirely irrelevant.  Page 51 has no footnotes.
Perhaps footnote 46 on page 48 was meant?  It deals with pointer
arithmetic, but is careful to specify "*integral* expression added to
or subtracted from the converted pointer" (emphasis mine).

The above-referenced p. 55, ll. 20-21 does say, under "Semantics" of
"Compound Assignment":

   A *compound* *assignment* of the form E1 *op*= E2 differs from the
   simple assignment expression E1 = E1 *op* (E2) only in that the
   lvalue E1 is evaluated only once.

However, the "Constraints" six lines up read:

   For the operators += and -= only, either the left operand shall be
   a pointer to an object type and the right shall have integral type,
   or the left operand shall have qualified or unqualified arithmetic
   type and the right shall have arithmetic type.

"(int *) 1" does not have integral type; it has pointer type.  Pointer
types and integral types are clearly distinguished in section 3.1.2.5,
"Types".

Section 3.3.6, "Additive Operators" (p. 47), (which applies due to the
"Semantics" section quoted above) has the constraint

   For addition, either both operand shall have arithmetic type, or
   one operand shall be a pointer to an object type and the other
   shall have integral type.

In section 3.3.4, "Cast Operators", in "Semantics",

   An arbitrary integer may be converted to a pointer.  The result is
   implementation-defined. \footnote{45. The mapping functions for
   converting a pointer to an integer or an integer to a pointer are
   intended to be consistent with the addressing structure of the
   execution environment.}

In short: bullshit.

				--Tim
				  "More accurately, it's fossilized
                                   horseshit."

--
  "Of course he has a knife; he always has a knife.  We all have knives.
  It's 1183 and we're barbarians." -- Eleanor of Aquitaine, "A Lion in Winter"
Tim McDaniel                 Applied Dynamics Int'l.; Ann Arbor, Michigan, USA
Internet: mcdaniel at adi.com                UUCP: {uunet,sharkey}!amara!mcdaniel



More information about the Comp.std.c mailing list