--* From postmaster%watson.vnet.ibm.com@yktvmv.watson.ibm.com  Tue Jul 12 10:07:33 1994
--* Received: from yktvmv-ob.watson.ibm.com by asharp.watson.ibm.com (AIX 3.2/UCB 5.64/930311)
--*           id AA30971; Tue, 12 Jul 1994 10:07:33 -0400
--* Received: from watson.vnet.ibm.com by yktvmv.watson.ibm.com (IBM VM SMTP V2R3)
--*    with BSMTP id 2293; Tue, 12 Jul 94 10:07:36 EDT
--* Received: from YKTVMV by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id <A.BRONSTEI.NOTE.YKTVMV.0729.Jul.12.10:07:35.-0400>
--*           for asbugs@watson; Tue, 12 Jul 94 10:07:36 -0400
--* Received: from inf.ethz.ch by watson.ibm.com (IBM VM SMTP V2R3) with TCP;
--*    Tue, 12 Jul 94 10:07:35 EDT
--* Received: from vinci.inf.ethz.ch (bronstei@vinci.inf.ethz.ch [129.132.12.46]) by inf.ethz.ch (8.6.9/8.6.9) with ESMTP id QAA26586 for <asbugs@watson.ibm.com>; Tue, 12 Jul 1994 16:07:29 +0200
--* From: FTP Admin of EC CATHODE <bronstei@inf.ethz.ch>
--* Received: (bronstei@localhost) by vinci.inf.ethz.ch (8.6.8/8.6.6) id QAA29235 for asbugs@watson.ibm.com; Tue, 12 Jul 1994 16:07:28 +0200
--* Date: Tue, 12 Jul 1994 16:07:28 +0200
--* Message-Id: <199407121407.QAA29235@vinci.inf.ethz.ch>
--* To: asbugs@watson.ibm.com
--* Subject: [4] internal compiler error (bad case 19) [bug.as][0.36.0]

--@ Fixed  by:  SSD   Fri Jul 15 11:53:58 EDT 1994 
--@ Tested by:  none 
--@ Summary:    inlExpr was inlining too much on the left-hand side of FOAM_Set expressions. 

------------------------------- reference.as ----------------------------------
--
-- vinci.inf.ethz.ch{bronstei} 91: asharp -Q2 -Fc reference.as
-- Bug: Bad case 19 (line 2339 in file ../src/genc.c).
--
-- Works ok with -Q1

#include "aslib.as"

Reference(T:Type): BasicType with {
	apply: % -> T;
	nil: %;
	nil?: % -> Boolean;
	ref: T -> %;
	set!: (%, T) -> T
} == add {
	macro Rep == P;
	macro R == Record(val:T);

	-- untagged union of Record and Nil
	P: with {
		nil?:    % -> Boolean;
		nilptr:  %;
		recptr:  R -> %;
		value:   % -> R;
		=:       (%, %) -> Boolean;
	} == add {
		macro Rep == Pointer;
		import from {Rep, Pointer};
		nil?(p: %):Boolean	== nil? rep p;
		nilptr:%		== per(nil$Pointer);
		recptr(r:R):%		== r pretend %;
		value(p:%):R		== p pretend R;
		(p:%) = (q:%):Boolean	== rep p = rep q;
	}
	import from {R, Rep};

	sample:%			== nil;
	(p:%) = (q:%):Boolean		== rep p = rep q;
	nil:%				== per nilptr;
	nil?(p:%):Boolean		== nil? rep p;
	ref(x:T):%			== per recptr [x];
	apply(p:%):T			== value(rep p).val;
	set!(p:%, x:T):T		== value(rep p).val := x;

	(p:TextWriter) << (q:%):TextWriter == {
		nil? q => p << "NIL";
		p << "ref(*)";
	}
}

 
