summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/gc/align.c8
-rw-r--r--src/cmd/gc/const.c3
-rw-r--r--src/cmd/gc/typecheck.c17
-rw-r--r--test/fixedbugs/issue4452.go13
4 files changed, 34 insertions, 7 deletions
diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c
index 118af7e16..be9f552f6 100644
--- a/src/cmd/gc/align.c
+++ b/src/cmd/gc/align.c
@@ -253,8 +253,12 @@ dowidth(Type *t)
checkwidth(t->type);
t->align = widthptr;
}
- else if(t->bound == -100)
- yyerror("use of [...] array outside of array literal");
+ else if(t->bound == -100) {
+ if(!t->broke) {
+ yyerror("use of [...] array outside of array literal");
+ t->broke = 1;
+ }
+ }
else
fatal("dowidth %T", t); // probably [...]T
break;
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c
index a1621efa9..f82ba9420 100644
--- a/src/cmd/gc/const.c
+++ b/src/cmd/gc/const.c
@@ -240,7 +240,8 @@ convlit1(Node **np, Type *t, int explicit)
bad:
if(!n->diag) {
- yyerror("cannot convert %N to type %T", n, t);
+ if(!t->broke)
+ yyerror("cannot convert %N to type %T", n, t);
n->diag = 1;
}
if(isideal(n->type)) {
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index 5cc398c8d..3771613af 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -377,8 +377,11 @@ reswitch:
t->bound = -1; // slice
} else if(l->op == ODDD) {
t->bound = -100; // to be filled in
- if(!(top&Ecomplit))
+ if(!(top&Ecomplit) && !n->diag) {
+ t->broke = 1;
+ n->diag = 1;
yyerror("use of [...] array outside of array literal");
+ }
} else {
l = typecheck(&n->left, Erv);
switch(consttype(l)) {
@@ -1028,8 +1031,11 @@ reswitch:
defaultlit(&n->left, T);
l = n->left;
if(l->op == OTYPE) {
- if(n->isddd || l->type->bound == -100)
- yyerror("invalid use of ... in type conversion", l);
+ if(n->isddd || l->type->bound == -100) {
+ if(!l->type->broke)
+ yyerror("invalid use of ... in type conversion", l);
+ n->diag = 1;
+ }
// pick off before type-checking arguments
ok |= Erv;
// turn CALL(type, arg) into CONV(arg) w/ type
@@ -1335,7 +1341,10 @@ reswitch:
if((t = n->left->type) == T || n->type == T)
goto error;
if((n->op = convertop(t, n->type, &why)) == 0) {
- yyerror("cannot convert %lN to type %T%s", n->left, n->type, why);
+ if(!n->diag && !n->type->broke) {
+ yyerror("cannot convert %lN to type %T%s", n->left, n->type, why);
+ n->diag = 1;
+ }
n->op = OCONV;
}
switch(n->op) {
diff --git a/test/fixedbugs/issue4452.go b/test/fixedbugs/issue4452.go
new file mode 100644
index 000000000..c75da9024
--- /dev/null
+++ b/test/fixedbugs/issue4452.go
@@ -0,0 +1,13 @@
+// errorcheck
+
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 4452. Used to print many errors, now just one.
+
+package main
+
+func main() {
+ _ = [...]int(4) // ERROR "use of \[\.\.\.\] array outside of array literal"
+}