[comp.sys.amiga.tech] Manx 5.0a bug

carry@deakin.OZ.AU (Carry Varley) (06/11/90)

Here is another bug in the Manx 5.0a Compiler.
This bit me when I tried compiling the AmigaTCP package.
The compiler modifies a register variable when no assignment has
been made, and then tries to use it as clean.
I have posted (snail) to Manx, but would appreciate any info on updates,
as their BBS is a bit expensive to access from Australia.
/*
 *	Example of bug in Aztec 5.0a Amiga 11JUN90 DAV
 *	The variable is kept in a register, corrupted, but still used.
 *	The macro should not have any side-effects !
 */

/* Extract a short from a long */
#define	hiword(x)	((unsigned short)((x) >> 16))
#define	loword(x)	((unsigned short)(x))

/* Extract a byte from a short */
#define	hibyte(x)	(((x) >> 8) & 0xff)
#define	lobyte(x)	((x) & 0xff)

long a = 0x01010101;

main()
{
	test(a);
}

test(num)
register long num;
{
	long f;

/* num is kept as register variable 
 * (d2 with -so, d4 if register keyword) */

	printf("num initially = %lx\n",num);

	f = lobyte(loword(num)); 	/* This line corrupts num  */

	printf("num now  = %lx\n",num);

}

David Varley
using carry@deakin.AU.OZ until I can compile AmigaTCP for SLIP !!