minor bugs
R=r
OCL=16163
CL=16163
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index 50d1e3b..94147ff 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -176,6 +176,10 @@
case TPTR64:
if(t->type == T)
fatal("dumpexporttype: ptr %S", s);
+ if(t->type->etype == TFORW) {
+ yyerror("export of a undefined forward reference: %S", s);
+ break;
+ }
makeexportsym(t->type);
ts = t->type->sym;
if(ts->exported == 0)
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 45716c3..024cd8d 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -265,8 +265,7 @@
ONAME, ONONAME,
ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
ODCLFUNC, ODCLFIELD, ODCLARG,
- OLIST, OCMP,
- OPTR, OARRAY,
+ OLIST, OCMP, OPTR, OARRAY,
ORETURN, OFOR, OIF, OSWITCH,
OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL,
OGOTO, OPROC, ONEW, OEMPTY, OSELECT,
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index 69b7c76..74af515 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -800,8 +800,11 @@
}
| convtype '{' keyexpr_list '}'
{
- // struct literal and conversions
- $$ = nod(OCONV, rev($3), N);
+ // composite literal
+ $$ = rev($3);
+ if($$ == N)
+ $$ = nod(OEMPTY, N, N);
+ $$ = nod(OCONV, $$, N);
$$->type = $1;
}
| fnliteral
@@ -1266,11 +1269,6 @@
$$->type = types[TINT32];
};
}
-| LIMPORT structdcl
- {
- $$ = $2;
- $$->etype = OIMPORT;
- }
interfacedcl:
new_name ',' interfacedcl
@@ -1695,7 +1693,7 @@
* to check whether the rest of the grammar is free of
* reduce/reduce conflicts, comment this section out by
* removing the slash on the next line.
- *
+ */
lpack:
LATYPE
{
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 6029214..d57dbe6 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -287,11 +287,6 @@
walkselect(n);
goto ret;
- case OEMPTY:
- if(top != Etop)
- goto nottop;
- goto ret;
-
case OIF:
if(top != Etop)
goto nottop;
@@ -500,16 +495,18 @@
case OFALL:
case OINDREG:
+ case OEMPTY:
goto ret;
case OCONV:
if(top == Etop)
goto nottop;
- walktype(n->left, Erv);
l = n->left;
if(l == N)
goto ret;
+ walktype(l, Erv);
+
t = n->type;
if(t == T)
goto ret;
@@ -552,7 +549,6 @@
// interface and structure
et = isandss(n->type, l);
if(et != Inone) {
-if(et == I2I) dump("conv", n);
indir(n, ifaceop(n->type, l, et));
goto ret;
}
@@ -2980,14 +2976,10 @@
l = structfirst(&savel, &n->type);
r = listfirst(&saver, &n->left);
+ if(r != N && r->op == OEMPTY)
+ r = N;
loop:
- if(l != T && l->etype == TFIELD && l->type->etype == TFUNC) {
- // skip methods
- l = structnext(&savel);
- goto loop;
- }
-
if(l == T || r == N) {
if(l != T)
yyerror("struct literal expect expr of type %T", l);
@@ -3027,6 +3019,8 @@
// make it a closed array
r = listfirst(&saver, &n->left);
+ if(r != N && r->op == OEMPTY)
+ r = N;
for(idx=0; r!=N; idx++)
r = listnext(&saver);
t->bound = idx;
@@ -3037,6 +3031,8 @@
idx = 0;
r = listfirst(&saver, &n->left);
+ if(r != N && r->op == OEMPTY)
+ r = N;
loop:
if(r == N)
@@ -3075,6 +3071,8 @@
addtop = list(addtop, a);
r = listfirst(&saver, &n->left);
+ if(r != N && r->op == OEMPTY)
+ r = N;
loop:
if(r == N) {