]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: avoid duplicate cast error
authorKashav Madan <kshvmdn@gmail.com>
Tue, 27 Jun 2017 23:29:59 +0000 (19:29 -0400)
committerRobert Griesemer <gri@golang.org>
Tue, 22 Aug 2017 13:44:35 +0000 (13:44 +0000)
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>
src/cmd/compile/internal/gc/const.go
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue20812.go [new file with mode: 0644]
test/rename1.go

index a465d4a7bb543aa71bb9adde3fcc907bd7139c25..c6a679ed783a4b975241f716f721f8ae249591ea 100644 (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)
        }
index b809a8bee74eb3aff9fe4f6d752c9fd0869fc8dd..2f30581cb861ba17211144ba9a63c7ec9baa9814 100644 (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)
                        }
diff --git a/test/fixedbugs/issue20812.go b/test/fixedbugs/issue20812.go
new file mode 100644 (file)
index 0000000..0175eed
--- /dev/null
@@ -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"
+}
index a71e5b2e5334fc92c706a24ac011258e356df592..568aa13d441c6f3e87eaefbc1cfffe4dd13de708 100644 (file)
 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"
        )
 
 }