C Compiler bug (and fix for a different one)

Andy Kashyap aka at cbrma.UUCP
Fri Aug 1 04:09:57 AEST 1986


In article <134 at sas.UUCP> jcz at sas.UUCP (Carl Zeigler) writes:
>  In article <5858 at alice.uUCp>, ark at alice.UucP (Andrew Koenig) writes:
>  > > So, does anyone have a fix for this bug?
>  > >
>  > > void f3(which)
>  > > {
>  > >     extern void f1(),f2();
>  > >     which?f1():f2();
>  > > }
>  > > cc(1) gives an "incompatible types" error.
>  > 
>  > As it should.  The only thing you're allowed to do with void values
>  > is throw them away.
>
>Scan again, Andrew, the (void) values are being thrown away.
>

No they are NOT; the value from the '?:' operator is being thrown away.
The '?:' operator expects a non-void value so it can decide 'which' and
pass the result to a higher level of expression (in this case there happens
to be none). The complaint of "incompatible types" is the result of the
'?:' operator expecting a non-void type as arguments and the arguments
providing a void type.
Wasn't that obvious from the diagnostics??? ;-)

To re-phrase, the '?:' doesn't look at its operands (parameters or arguments)
as function calls -- they might as well be 'f1()+5' or so -- but as
expressions. Therefore it '*RETURNS THE VALUE* of one of its operands
depending on the third'.

A semantic point of view:

A function call is an expression and can, therefore, be used anywhere an
expression can be used. When you declare a function (void), you state that
you intend to use that function as a statement instead, that you do not 
intend to use it in any operations. It can now only be used where a statement
can. Keep in mind that an expression is a statement, but NOT vice-versa.

If you look up the reference section of K&R, somewhere it says something
like this (I don't have my K&R with me):
	...
	expression -> expression ? expression : expression
	...
Thus you can not use a statement (ie (void) f1()) where an expression is
expected.

The BUG: there ain't none.
The FIX: use 'if' instead.

- andy kashyap
-- 

+---------------------------------------------------------------------------+
: Jim, what's the value of Pi?                         : Andy Kashyap       :
: About 3.14159. Why do you ask, Doctor?               : AT&T Bell Labs     :
: Actually, Captain, the exact value is 3.1415926535...: Columbus OH        :
: Kirk & McCoy: Shut Up, Spock!!!                      : ..!cbosgd!cbrma!aka:
+---------------------------------------------------------------------------+



More information about the Comp.lang.c mailing list