If an error was already printed during LHS conversion step, we don't reprint
the "cannot convert" error.
In particular, this prevents `_ = int("1")` (and all similar casts) from
resulting in multiple identical error messages being printed.
Fixes #20812.
Change-Id: If6e52c59eab438599d641ecf6f110ebafca740a9
Reviewed-on: https://go-review.googlesource.com/46912
Reviewed-by: Robert Griesemer <gri@golang.org>
bad:
if !n.Diag() {
if !t.Broke() {
- yyerror("cannot convert %v to type %v", n, t)
+ yyerror("cannot convert %L to type %v", n, t)
}
n.SetDiag(true)
}
var why string
n.Op = convertop(t, n.Type, &why)
if n.Op == 0 {
- if !n.Diag() && !n.Type.Broke() {
+ if !n.Diag() && !n.Type.Broke() && !n.Left.Diag() {
yyerror("cannot convert %L to type %v%s", n.Left, n.Type, why)
n.SetDiag(true)
}
--- /dev/null
+// 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.
+
+package p
+
+func f() {
+ _ = int("1") // ERROR "cannot convert"
+ _ = bool(0) // ERROR "cannot convert"
+ _ = bool("false") // ERROR "cannot convert"
+ _ = int(false) // ERROR "cannot convert"
+ _ = string(true) // ERROR "cannot convert"
+}
package main
func main() {
- var n byte // ERROR "not a type|expected type"
+ var n byte // ERROR "not a type|expected type"
var y = float32(0) // ERROR "cannot call|expected function"
const (
- a = 1 + iota // ERROR "string|incompatible types" "convert iota"
+ a = 1 + iota // ERROR "invalid operation|incompatible types" "cannot convert iota"
)
}