mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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:
parent
63c4284346
commit
d05a1238d6
4 changed files with 19 additions and 4 deletions
|
|
@ -408,7 +408,7 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node {
|
||||||
bad:
|
bad:
|
||||||
if !n.Diag() {
|
if !n.Diag() {
|
||||||
if !t.Broke() {
|
if !t.Broke() {
|
||||||
yyerror("cannot convert %v to type %v", n, t)
|
yyerror("cannot convert %L to type %v", n, t)
|
||||||
}
|
}
|
||||||
n.SetDiag(true)
|
n.SetDiag(true)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1760,7 +1760,7 @@ OpSwitch:
|
||||||
var why string
|
var why string
|
||||||
n.Op = convertop(t, n.Type, &why)
|
n.Op = convertop(t, n.Type, &why)
|
||||||
if n.Op == 0 {
|
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)
|
yyerror("cannot convert %L to type %v%s", n.Left, n.Type, why)
|
||||||
n.SetDiag(true)
|
n.SetDiag(true)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
test/fixedbugs/issue20812.go
Normal file
15
test/fixedbugs/issue20812.go
Normal 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"
|
||||||
|
}
|
||||||
|
|
@ -10,10 +10,10 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
func 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"
|
var y = float32(0) // ERROR "cannot call|expected function"
|
||||||
const (
|
const (
|
||||||
a = 1 + iota // ERROR "string|incompatible types" "convert iota"
|
a = 1 + iota // ERROR "invalid operation|incompatible types" "cannot convert iota"
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue