cmd/compile: avoid duplicate cast error

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>
This commit is contained in:
Kashav Madan 2017-06-27 19:29:59 -04:00 committed by Robert Griesemer
parent 63c4284346
commit d05a1238d6
4 changed files with 19 additions and 4 deletions

View file

@ -408,7 +408,7 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node {
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)
}

View file

@ -1760,7 +1760,7 @@ OpSwitch:
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)
}

View file

@ -0,0 +1,15 @@
// 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"
}

View file

@ -10,10 +10,10 @@
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"
)
}