]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: typecheck type switch variables
authorDmitry Vyukov <dvyukov@google.com>
Fri, 30 Jan 2015 08:23:22 +0000 (11:23 +0300)
committerDmitry Vyukov <dvyukov@google.com>
Tue, 3 Feb 2015 15:44:06 +0000 (15:44 +0000)
Type switch variables was not typechecked.
Previously it lead only to a minor consequence:

switch unsafe.Sizeof = x.(type) {

generated an inconsistent error message.
But capturing by value functionality now requries typechecking of all ONAMEs.

Fixes #9731

Change-Id: If037883cba53d85028fb97b1328696091b3b7ddd
Reviewed-on: https://go-review.googlesource.com/3600
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/gc/swt.c
test/fixedbugs/issue9731.go [new file with mode: 0644]

index e1d8af8786deed1ddfadbaa0e0fe9e0ed4aa6624..ca5455d4790143829be8bbdcd2a88ab82ae495b1 100644 (file)
@@ -939,6 +939,8 @@ typecheckswitch(Node *n)
                                        // multiple entry type switch or default
                                        nvar->ntype = typenod(n->type);
                                }
+                               typecheck(&nvar, Erv | Easgn);
+                               ncase->nname = nvar;
                        }
                }
                typechecklist(ncase->nbody, Etop);
diff --git a/test/fixedbugs/issue9731.go b/test/fixedbugs/issue9731.go
new file mode 100644 (file)
index 0000000..286cebd
--- /dev/null
@@ -0,0 +1,21 @@
+// compile
+
+// Copyright 2014 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(x interface{}) {
+       switch x := x.(type) {
+       case int:
+               func() {
+                       _ = x
+               }()
+       case map[int]int:
+               func() {
+                       for range x {
+                       }
+               }()
+       }
+}