summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2009-03-11 17:37:04 -0700
committerKen Thompson <ken@golang.org>2009-03-11 17:37:04 -0700
commitb5d3e29e213daf4b864fa3e38477860f649ef023 (patch)
tree8cfb09be153e492bf4efffdb97aa0653b1c5e778
parent196758e3ba136c195940a13a034014a8ea666348 (diff)
downloadgolang-b5d3e29e213daf4b864fa3e38477860f649ef023.tar.gz
bug 125
R=r OCL=26146 CL=26146
-rw-r--r--src/cmd/gc/walk.c22
-rw-r--r--test/fixedbugs/bug122.go (renamed from test/bugs/bug122.go)0
-rw-r--r--test/golden.out6
3 files changed, 21 insertions, 7 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 6c93c11cf..4652a75f8 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -2220,6 +2220,10 @@ mapop(Node *n, int top)
fatal("mapop: unknown op %O", n->op);
case OMAKE:
+ cl = listcount(n->left);
+ if(cl > 1)
+ yyerror("too many arguments to make map");
+
if(top != Erv)
goto nottop;
@@ -2232,8 +2236,9 @@ mapop(Node *n, int top)
break;
a = n->left; // hint
- if(n->left == N)
+ if(cl != 1)
a = nodintconst(0);
+
r = a;
a = nodintconst(algtype(t->type)); // val algorithm
r = list(a, r);
@@ -2427,6 +2432,10 @@ chanop(Node *n, int top)
fatal("chanop: unknown op %O", n->op);
case OMAKE:
+ cl = listcount(n->left);
+ if(cl > 1)
+ yyerror("too many arguments to make chan");
+
// newchan(elemsize int, elemalg int,
// hint int) (hmap *chan[any-1]);
@@ -2434,12 +2443,12 @@ chanop(Node *n, int top)
if(t == T)
break;
- if(n->left != N) {
+ a = nodintconst(0);
+ if(cl == 1) {
// async buf size
a = nod(OCONV, n->left, N);
a->type = types[TINT];
- } else
- a = nodintconst(0);
+ }
r = a;
a = nodintconst(algtype(t->type)); // elem algorithm
@@ -2602,6 +2611,7 @@ arrayop(Node *n, int top)
Type *t, *tl;
Node *on;
Iter save;
+ int cl;
r = n;
switch(n->op) {
@@ -2658,6 +2668,10 @@ arrayop(Node *n, int top)
return n;
case OMAKE:
+ cl = listcount(n->left);
+ if(cl > 2)
+ yyerror("too many arguments to make array");
+
// newarray(nel int, max int, width int) (ary []any)
t = fixarray(n->type);
if(t == T)
diff --git a/test/bugs/bug122.go b/test/fixedbugs/bug122.go
index 775cf73e8..775cf73e8 100644
--- a/test/bugs/bug122.go
+++ b/test/fixedbugs/bug122.go
diff --git a/test/golden.out b/test/golden.out
index 64f7e2586..df7be75c1 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -125,9 +125,6 @@ bugs/bug117.go:9: illegal types for operand: RETURN
int
BUG: should compile
-=========== bugs/bug122.go
-BUG: compilation succeeds incorrectly
-
=========== bugs/bug125.go
BUG: errchk: command succeeded unexpectedly: 6g bugs/bug125.go
@@ -268,6 +265,9 @@ fixedbugs/bug121.go:20: illegal types for operand: AS
I
*S
+=========== fixedbugs/bug122.go
+fixedbugs/bug122.go:6: too many arguments to make array
+
=========== fixedbugs/bug133.go
fixedbugs/bug133.dir/bug2.go:11: undefined DOT i on bug0.T
fixedbugs/bug133.dir/bug2.go:11: illegal types for operand: RETURN