]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use "N variables but M values" error for OAS
authorMatthew Dempsky <mdempsky@google.com>
Fri, 24 Aug 2018 19:37:25 +0000 (12:37 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 4 Sep 2018 19:05:56 +0000 (19:05 +0000)
Makes the error message more consistent between OAS and OAS2.

Fixes #26616.

Change-Id: I07ab46c5ef8a37efb2cb557632697f5d1bf789f7
Reviewed-on: https://go-review.googlesource.com/131280
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue26616.go [new file with mode: 0644]

index 370f21befbdb66bfecd222ccfc5e301ecc6134d8..cc98c3ae69e6c25c69e8f9a9da71efa88bbc5066 100644 (file)
@@ -3333,10 +3333,17 @@ func typecheckas(n *Node) {
                n.Left = typecheck(n.Left, Erv|Easgn)
        }
 
-       n.Right = typecheck(n.Right, Erv)
+       // Use Efnstruct so we can emit an "N variables but M values" error
+       // to be consistent with typecheckas2 (#26616).
+       n.Right = typecheck(n.Right, Erv|Efnstruct)
        checkassign(n, n.Left)
        if n.Right != nil && n.Right.Type != nil {
-               if n.Left.Type != nil {
+               if n.Right.Type.IsFuncArgStruct() {
+                       yyerror("assignment mismatch: 1 variable but %d values", n.Right.Type.NumFields())
+                       // Multi-value RHS isn't actually valid for OAS; nil out
+                       // to indicate failed typechecking.
+                       n.Right.Type = nil
+               } else if n.Left.Type != nil {
                        n.Right = assignconv(n.Right, n.Left.Type, "assignment")
                }
        }
diff --git a/test/fixedbugs/issue26616.go b/test/fixedbugs/issue26616.go
new file mode 100644 (file)
index 0000000..46136dc
--- /dev/null
@@ -0,0 +1,20 @@
+// errorcheck
+
+// Copyright 2018 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
+
+var x int = three() // ERROR "1 variable but 3 values"
+
+func f() {
+       var _ int = three() // ERROR "1 variable but 3 values"
+       var a int = three() // ERROR "1 variable but 3 values"
+       a = three()         // ERROR "1 variable but 3 values"
+       b := three()        // ERROR "1 variable but 3 values"
+
+       _, _ = a, b
+}
+
+func three() (int, int, int)