[comp.lang.eiffel] Two Eiffel bugs in the "@" operator.

paj@hic.uucp (Paul Johnson) (03/23/90)

The following are a couple of bugs I have come accross while using
Eiffel.  In order to save other people the trouble of tracking them
down, I have decided to post them here rather than just sending them
to ISE.

Bug one: the address-of operator "@" on integers produces illegal C code.

----------------------------------------------------------------------
--|
--| Author:	Paul Johnson
--|
--| Created:	Thu Mar 22 15:23:30 1990
--|
--| Function:	This class fails to C-compile.
--|
----------------------------------------------------------------------

indexing

   names:		bug, address;

class ADDRESS_BUG export
   item
   
feature
   
   Create is
	 -- Demonstrate a bug.
      external
	 c_foo( x: INTEGER ) language "C";
      do
	 c_foo( @item );
      end; -- Create
   
   item: INTEGER;
	 -- Feature to have its address taken.

end -- class ADDRESS_BUG


The body of the Create function produces the following fragment:

       c_foo(
       /* item  */ &INTDAT(DCurrent[0]));
       ;

The variable "DCurrent" is not declared.  If the "@" is left out of
the call to c_foo then this variable is declared and initialised on
the previous line.

Also, when I first encountered this bug, the symptoms were different.
DCurrent was declared, but the standard C compiler rejected the
argument to "&".  Gnu gcc was quite happy with it (hence I am now
using gcc for C compilation).  This was probably due to the C function
having another argument whose address was not taken.


Bug 2: Using the "@" operator on local integers fails silently during
pass 4.


----------------------------------------------------------------------
--|
--| Author:	Paul Johnson
--|
--| Created:	Thu Mar 22 15:39:43 1990
--|
--| Function:	This class fails to compile during pass 4.
--|
----------------------------------------------------------------------

indexing

   names:		local_bug, address;

class LOCAL_BUG export
   
feature
   
   Create is
	 -- Demonstrate a bug.
      external
	 c_foo( v: INTEGER ) language "C";
      local
	 i: INTEGER;
      do
	 c_foo( @i );
      end; -- Create

end -- class LOCAL_BUG

When compiling this, ec prints out "**Pass 4 cancelled" and stops with
no other explanation.  The bug disappears if the "@" sign is removed.


Paul Johnson                               UUCP: <world>!mcvax!ukc!gec-mrc!paj
--------------------------------!-------------------------|-------------------
GEC-Marconi Research is not 	| Telex: 995016 GECRES G  | Tel: +44 245 73331
responsible for my opinions.	| Inet: paj@uk.co.gec-mrc | Fax: +44 245 75244