aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto Donizetti <alb.donizetti@gmail.com>2017-04-13 10:42:16 +0200
committerRobert Griesemer <gri@golang.org>2017-04-20 22:21:55 +0000
commit3218b1aa6fffef560147bcbbcb313a5c8a5e0d76 (patch)
tree24493c4421f6bac7f36914273e965236ec9aebc5
parent405a280d01ee6434eea306e3f849ba0586cc8f78 (diff)
downloadgo-3218b1aa6fffef560147bcbbcb313a5c8a5e0d76.tar.xz
cmd/compile: only print one error for bad-type literal in assignment
Fixes #8438 Change-Id: Ib43cdcdc962a8d9e14faf984bc859a92ba1eb517 Reviewed-on: https://go-review.googlesource.com/40531 Reviewed-by: Robert Griesemer <gri@golang.org>
-rw-r--r--src/cmd/compile/internal/gc/subr.go4
-rw-r--r--test/fixedbugs/issue8438.go17
-rw-r--r--test/interface/explicit.go3
3 files changed, 21 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go
index ff2d88614b..b52b4e4e69 100644
--- a/src/cmd/compile/internal/gc/subr.go
+++ b/src/cmd/compile/internal/gc/subr.go
@@ -982,7 +982,9 @@ func assignconvfn(n *Node, t *types.Type, context func() string) *Node {
var why string
op := assignop(n.Type, t, &why)
if op == 0 {
- yyerror("cannot use %L as type %v in %s%s", n, t, context(), why)
+ if !old.Diag() {
+ yyerror("cannot use %L as type %v in %s%s", n, t, context(), why)
+ }
op = OCONV
}
diff --git a/test/fixedbugs/issue8438.go b/test/fixedbugs/issue8438.go
new file mode 100644
index 0000000000..b28025cdac
--- /dev/null
+++ b/test/fixedbugs/issue8438.go
@@ -0,0 +1,17 @@
+// errorcheck
+
+// Copyright 2017 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.
+
+// Check that we don't print duplicate errors for string ->
+// array-literal conversion
+
+package main
+
+func main() {
+ _ = []byte{"foo"} // ERROR "cannot convert"
+ _ = []int{"foo"} // ERROR "cannot convert"
+ _ = []rune{"foo"} // ERROR "cannot convert"
+ _ = []string{"foo"} // OK
+}
diff --git a/test/interface/explicit.go b/test/interface/explicit.go
index b10d02f248..3c449b13ad 100644
--- a/test/interface/explicit.go
+++ b/test/interface/explicit.go
@@ -53,7 +53,7 @@ func main() {
i2 = I2(i) // ERROR "invalid|missing N method"
e = E(t) // ok
- t = T(e) // ERROR "need explicit|need type assertion|incompatible" "as type [*]T"
+ t = T(e) // ERROR "need explicit|need type assertion|incompatible"
}
type M interface {
@@ -81,7 +81,6 @@ var m2 M = jj // ERROR "incompatible|wrong type for M method"
var m3 = M(ii) // ERROR "invalid|missing"
var m4 = M(jj) // ERROR "invalid|wrong type for M method"
-
type B1 interface {
_() // ERROR "methods must have a unique non-blank name"
}