From: Russ Cox Date: Sat, 2 Feb 2013 02:21:27 +0000 (-0500) Subject: cmd/gc: silence redundant error prints for misuse of [...]int X-Git-Tag: go1.1rc2~1186 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f607c479eabab497b3e7d3dead472a19bd27e063;p=gostls13.git cmd/gc: silence redundant error prints for misuse of [...]int Fixes #4452. R=ken2 CC=golang-dev https://golang.org/cl/7241065 --- diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c index 118af7e162..be9f552f67 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 a1621efa95..f82ba9420d 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 5cc398c8d0..3771613af8 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 0000000000..c75da90245 --- /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" +}