]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: silence redundant error prints for misuse of [...]int
authorRuss Cox <rsc@golang.org>
Sat, 2 Feb 2013 02:21:27 +0000 (21:21 -0500)
committerRuss Cox <rsc@golang.org>
Sat, 2 Feb 2013 02:21:27 +0000 (21:21 -0500)
Fixes #4452.

R=ken2
CC=golang-dev
https://golang.org/cl/7241065

src/cmd/gc/align.c
src/cmd/gc/const.c
src/cmd/gc/typecheck.c
test/fixedbugs/issue4452.go [new file with mode: 0644]

index 118af7e16220b902579e16f1f75c45a0940e4e7a..be9f552f67e4221edf2386aeb6eeec7fb27ab2fc 100644 (file)
@@ -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;
index a1621efa95bb8fff40f3239e75fabedd85d815a7..f82ba9420d10599dacff75c680b2db968766ef45 100644 (file)
@@ -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)) {
index 5cc398c8d0cf28ae7493e8c709ffed4b7b23b429..3771613af8878ac6c1e371643a008b6d3779b56b 100644 (file)
@@ -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 (file)
index 0000000..c75da90
--- /dev/null
@@ -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"
+}