Commit d05a1238 authored by Kashav Madan's avatar Kashav Madan Committed by Robert Griesemer

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/46912Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 63c42843
......@@ -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)
}
......
......@@ -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)
}
......
// 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"
}
......@@ -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"
)
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment