Subject: bin/2097: code generation bug! (m68k) - in xlint
To: None <gnats-bugs@NetBSD.ORG>
From: Peter Seebach <seebs@taniemarie.solon.com>
List: netbsd-bugs
Date: 02/18/1996 12:47:43
>Number:         2097
>Category:       bin
>Synopsis:       (x || y) may be 1 when x and y are both 0.
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Feb 18 14:20:00 1996
>Last-Modified:
>Originator:     Peter Seebach
>Organization:
Usenet Fact Police (Undercover)
>Release:        Feb 17 96
>Environment:
System: NetBSD taniemarie 1.1A NetBSD 1.1A (SEEBS) #0: Mon Jan 15 20:07:46 CST 1996 seebs@taniemarie:/usr/src/sys/arch/amiga/compile/SEEBS amiga


>Description:
	I discovered that lint was spuriously reporting integer constant too
	large.  The following simple program produces the problem:

>How-To-Repeat:
	Study lint's behavior, and dissect code in cgram.y.
>Fix:
	I have *no* clue.  Adding ()'s around the operands of the || does
	not change the result, so it's not a precedence handling problem.
>Audit-Trail:
>Unformatted:
>enum foo {
>	BAR,
>	BAZ,
>	QUUX = BAZ << 1
>};
>
>int i = QUUX;

	lint run on this spuriously complains that the integer constant is
	too large.

	Where's the code generation bug?

	I added the following to cgram.y:
fprintf(stderr, "!utyp - > %d, < %d - || %d\n",
        (v->v_quad > (quad_t) INT_MAX),
	(v->v_quad < (quad_t) INT_MIN),
	(v->v_quad > (quad_t) INT_MAX || v->v_quad < (quad_t) INT_MIN));

...
I get
	!utyp - > 0, < 0 - || 1
from this.

Above that, I have:
fprintf(stderr, "quad %qd (%d as int) > %lu ? %d\n",
        (quad_t) v->v_quad, i, (unsigned long) INT_MAX,
	((unsigned long) v->v_quad > (unsigned long) INT_MAX));
which says:
	quad 2 (2 as int) > 2147483647 ? 0

	It seems to be clear that 2 is within [INT_MIN,INT_MAX] pretty
	comfortably.

	I cannot figure out why this doesn't happen if the value QUUX is
	simply created as 2, but only if it's created by a <<.

	My concern about the code generation is simply that, to the best
	of my knowledge, the 3rd result of that 1st printf up there *cannot*
	be correct.