make 6g constants behave as ken proposes.  (i hope.)
various bug fixes and tests involving constants.

test/const1.go is the major new test case.

R=ken
OCL=26216
CL=26224
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 0306eab..46c99ba 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -371,6 +371,10 @@
 	TFORWSTRUCT,
 	TFORWINTER,
 
+	// pseudo-types for literals
+	TIDEAL,
+	TNIL,
+
 	NTYPE,
 };
 enum
@@ -378,10 +382,7 @@
 	CTxxx,
 
 	CTINT,
-	CTSINT,
-	CTUINT,
 	CTFLT,
-
 	CTSTR,
 	CTBOOL,
 	CTNIL,
@@ -389,26 +390,6 @@
 
 enum
 {
-	/* indications for whatis() */
-	Wnil	= 0,
-	Wtnil,
-
-	Wtfloat,
-	Wtint,
-	Wtbool,
-	Wtstr,
-
-	Wlitfloat,
-	Wlitint,
-	Wlitbool,
-	Wlitstr,
-	Wlitnil,
-
-	Wtunkn,
-};
-
-enum
-{
 	/* types of channel */
 	Cxxx,
 	Cboth,
@@ -518,10 +499,9 @@
 EXTERN	int	importflag;
 EXTERN	int	inimportsys;
 
-EXTERN	Node*	booltrue;
-EXTERN	Node*	boolfalse;
 EXTERN	uint32	iota;
 EXTERN	Node*	lastconst;
+EXTERN	Type*	lasttype;
 EXTERN	int32	vargen;
 EXTERN	int32	exportgen;
 EXTERN	int32	maxarg;
@@ -594,7 +574,7 @@
 void	mpmodfixfix(Mpint *a, Mpint *b);
 void	mpatofix(Mpint *a, char *s);
 void	mpatoflt(Mpflt *a, char *s);
-void	mpmovefltfix(Mpint *a, Mpflt *b);
+int	mpmovefltfix(Mpint *a, Mpflt *b);
 void	mpmovefixflt(Mpflt *a, Mpint *b);
 int	Bconv(Fmt*);
 
@@ -611,7 +591,7 @@
 void	mpdivfract(Mpint *a, Mpint *b);
 void	mpnegfix(Mpint *a);
 void	mpandfixfix(Mpint *a, Mpint *b);
-void	mpnotandfixfix(Mpint *a, Mpint *b);
+void	mpandnotfixfix(Mpint *a, Mpint *b);
 void	mplshfixfix(Mpint *a, Mpint *b);
 void	mporfixfix(Mpint *a, Mpint *b);
 void	mprshfixfix(Mpint *a, Mpint *b);
@@ -651,6 +631,7 @@
 void	linehist(char*, int32);
 int32	setlineno(Node*);
 Node*	nod(int, Node*, Node*);
+Node*	nodlit(Val);
 Node*	list(Node*, Node*);
 Type*	typ(int);
 Dcl*	dcl(void);
@@ -680,9 +661,10 @@
 int	eqargs(Type*, Type*);
 uint32	typehash(Type*, int);
 void	frame(int);
-Node*	literal(int32);
 Node*	dobad(void);
-Node*	nodintconst(int32);
+Node*	nodintconst(int64);
+Node*	nodnil(void);
+Node*	nodbool(int);
 void	ullmancalc(Node*);
 void	badtype(int, Type*, Type*);
 Type*	ptrto(Type*);
@@ -735,7 +717,8 @@
 Type*	dodcltype(Type*);
 void	updatetype(Type*, Type*);
 void	dodclconst(Node*, Node*);
-void	defaultlit(Node*);
+void	defaultlit(Node*, Type*);
+void	defaultlit2(Node*, Node*);
 int	listcount(Node*);
 void	addmethod(Node*, Type*, int);
 Node*	methodname(Node*, Type*);
@@ -806,7 +789,7 @@
 void	doimport7(Node*, Node*);
 void	doimport8(Node*, Val*, Node*);
 void	doimport9(Sym*, Node*);
-void	importconst(Node *ss, Type *t, Val *v);
+void	importconst(Node *ss, Type *t, Node *v);
 void	importmethod(Sym *s, Type *t);
 void	importtype(Node *ss, Type *t);
 void	importvar(Node *ss, Type *t, int ctxt);
@@ -826,7 +809,6 @@
 void	walkbool(Node*);
 void	walkswitch(Node*);
 void	walkselect(Node*);
-int	whatis(Node*);
 void	walkdot(Node*);
 Node*	ascompatee(int, Node**, Node**);
 Node*	ascompatet(int, Node**, Type**, int);
@@ -871,6 +853,8 @@
 void	evconst(Node*);
 int	cmpslit(Node *l, Node *r);
 int	smallintconst(Node*);
+int	consttype(Node*);
+int	isconst(Node*, int);
 
 /*
  *	gen.c/gsubr.c/obj.c