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);