more maps
more semi-colons
type assignment of constants

SVN=123278
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c
index 589066a..9bd3e74 100644
--- a/src/cmd/gc/const.c
+++ b/src/cmd/gc/const.c
@@ -20,7 +20,17 @@
 		goto bad1;
 
 	case Wlitnil:
-		if(isptr[et] || et = TINTER)
+		if(isptr[et] || et == TINTER)
+			break;
+		goto bad1;
+
+	case Wlitstr:
+		if(isptrto(t, TSTRING))
+			break;
+		goto bad1;
+
+	case Wlitbool:
+		if(et == TBOOL)
 			break;
 		goto bad1;
 
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 0946b68..4e08bc5 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -446,6 +446,7 @@
 void	fatal(char*, ...);
 void	linehist(char*, long);
 Node*	nod(int, Node*, Node*);
+Node*	list(Node*, Node*);
 Type*	typ(int);
 Dcl*	dcl(void);
 Node*	rev(Node*);
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index c72900f..c07d113 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -30,7 +30,7 @@
 %type	<lint>		chandir
 %type	<node>		xdcl xdcl_list_r oxdcl_list common_dcl
 %type	<node>		oarg_type_list arg_type_list_r arg_type
-%type	<node>		else_stmt1 else_stmt2
+%type	<node>		else_stmt1 else_stmt2 inc_stmt noninc_stmt
 %type	<node>		complex_stmt compound_stmt ostmt_list
 %type	<node>		stmt_list_r Astmt_list_r Bstmt_list_r
 %type	<node>		Astmt Bstmt Cstmt Dstmt
@@ -232,20 +232,14 @@
 	}
 
 simple_stmt:
+	inc_stmt
+|	noninc_stmt
+
+noninc_stmt:
 	expr
 	{
 		$$ = $1;
 	}
-|	expr LINC
-	{
-		$$ = nod(OASOP, $1, literal(1));
-		$$->etype = OADD;
-	}
-|	expr LDEC
-	{
-		$$ = nod(OASOP, $1, literal(1));
-		$$->etype = OSUB;
-	}
 |	expr LASOP expr
 	{
 		$$ = nod(OASOP, $1, $3);
@@ -264,6 +258,18 @@
 		$$ = nod(OAS, $1, $3);
 	}
 
+inc_stmt:
+	expr LINC
+	{
+		$$ = nod(OASOP, $1, literal(1));
+		$$->etype = OADD;
+	}
+|	expr LDEC
+	{
+		$$ = nod(OASOP, $1, literal(1));
+		$$->etype = OSUB;
+	}
+
 complex_stmt:
 	LFOR for_stmt
 	{
@@ -1094,14 +1100,15 @@
  * need semi in back  YES
  */
 Cstmt:
-	simple_stmt
+	noninc_stmt
 
 /*
  * need semi in front YES
  * need semi in back  NO
  */
 Dstmt:
-	new_name ':'
+	inc_stmt
+|	new_name ':'
 	{
 		$$ = nod(OLABEL, $1, N);
 	}
@@ -1114,15 +1121,15 @@
 |	Dstmt
 |	Astmt_list_r Astmt
 	{
-		$$ = nod(OLIST, $1, $2);
+		$$ = list($1, $2);
 	}
 |	Astmt_list_r Dstmt
 	{
-		$$ = nod(OLIST, $1, $2);
+		$$ = list($1, $2);
 	}
 |	Bstmt_list_r Astmt
 	{
-		$$ = nod(OLIST, $1, $2);
+		$$ = list($1, $2);
 	}
 
 /*
@@ -1133,15 +1140,15 @@
 |	Cstmt
 |	Astmt_list_r Bstmt
 	{
-		$$ = nod(OLIST, $1, $2);
+		$$ = list($1, $2);
 	}
 |	Astmt_list_r Cstmt
 	{
-		$$ = nod(OLIST, $1, $2);
+		$$ = list($1, $2);
 	}
 |	Bstmt_list_r Bstmt
 	{
-		$$ = nod(OLIST, $1, $2);
+		$$ = list($1, $2);
 	}
 
 stmt_list_r:
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 1cd9f94..4992005 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -254,6 +254,16 @@
 	return n;
 }
 
+Node*
+list(Node *a, Node *b)
+{
+	if(a == N)
+		return b;
+	if(b == N)
+		return a;
+	return nod(OLIST, a, b);
+}
+
 Type*
 typ(int et)
 {
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 16f0c2c..56475b1 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -12,8 +12,12 @@
 void
 walk(Node *fn)
 {
+	if(debug['W'])
+		dump("fn-before", fn->nbody);
 	curfn = fn;
 	walktype(fn->nbody, Etop);
+	if(debug['W'])
+		dump("fn", fn->nbody);
 }
 
 void
@@ -458,6 +462,9 @@
 			goto badt;
 
 		case TMAP:
+
+print("top=%d type %lT", top, t);
+dump("index", n);
 			// right side must map type
 			if(n->right->type == T) {
 				convlit(n->right, t->down);
@@ -470,6 +477,8 @@
 				goto badt;
 			n->op = OINDEX;
 			n->type = t->type;
+			if(top == Erv)
+*n = *mapop(n, top);
 			break;
 
 		case TSTRING:
@@ -710,7 +719,6 @@
 {
 	Node *n, *c;
 	Type *place;
-
 	place = call(sw->ntest, T);
 
 	n = sw->nbody;
@@ -1372,10 +1380,10 @@
 		r->type = n->type;
 		break;
 
-	case OINDEXPTR:
+	case OINDEX:
 		if(top != Erv)
 			goto nottop;
-
+dump("access start", n);
 		// mapaccess1(hmap *map[any]any, key any) (val any);
 
 		t = fixmap(n->left->type);
@@ -1408,6 +1416,7 @@
 		r = nod(OCALL, on, r);
 		walktype(r, Erv);
 		r->type = t->type;
+dump("access finish", r);
 		break;
 
 		// mapaccess2(hmap *map[any]any, key any) (val any, pres bool);