From bf899befdbf923924139e655585c154c4935f2d3 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 26 Jul 2011 00:52:02 -0400 Subject: [PATCH] gc: disallow [...][...]int{{1,2,3}} Fixes #1600. R=ken2 CC=golang-dev https://golang.org/cl/4819045 --- src/cmd/gc/go.h | 1 + src/cmd/gc/typecheck.c | 11 ++++------- test/ddd1.go | 2 ++ 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index ee4ee6c89b..f7d6597603 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -531,6 +531,7 @@ enum Eindir = 1<<8, // indirecting through expression Eaddr = 1<<9, // taking address of expression Eproc = 1<<10, // inside a go statement + Ecomplit = 1<<11, // type in composite literal }; #define BITS 5 diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index dfe0f30f77..80af8201d8 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -239,6 +239,8 @@ reswitch: t->bound = -1; // slice } else if(l->op == ODDD) { t->bound = -100; // to be filled in + if(!(top&Ecomplit)) + yyerror("use of [...] array outside of array literal"); } else { l = typecheck(&n->left, Erv); switch(consttype(l)) { @@ -1342,11 +1344,6 @@ ret: case TNIL: case TBLANK: break; - case TARRAY: - if(t->bound == -100) { - yyerror("use of [...] array outside of array literal"); - t->bound = 1; - } default: checkwidth(t); } @@ -1971,7 +1968,7 @@ typecheckcomplit(Node **np) } setlineno(n->right); - l = typecheck(&n->right /* sic */, Etype); + l = typecheck(&n->right /* sic */, Etype|Ecomplit); if((t = l->type) == T) goto error; nerr = nerrors; @@ -2039,7 +2036,7 @@ typecheckcomplit(Node **np) l->right->right = typenod(pushtype); typecheck(&l->right, Erv); defaultlit(&l->right, t->type); - l->right = assignconv(l->right, t->type, "array index"); + l->right = assignconv(l->right, t->type, "array element"); } if(t->bound == -100) t->bound = len; diff --git a/test/ddd1.go b/test/ddd1.go index 96a358e1c0..83e32de7b6 100644 --- a/test/ddd1.go +++ b/test/ddd1.go @@ -44,4 +44,6 @@ func bad(args ...int) { _ = unsafe.Pointer(&x...) // ERROR "[.][.][.]" _ = unsafe.Sizeof(x...) // ERROR "[.][.][.]" _ = [...]byte("foo") // ERROR "[.][.][.]" + _ = [...][...]int{{1,2,3},{4,5,6}} // ERROR "[.][.][.]" } +