From 8e2423a67dab2fe8f218dc37bb31ec26aaad7c14 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 30 Jan 2015 11:23:22 +0300 Subject: [PATCH] cmd/gc: typecheck type switch variables 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 --- src/cmd/gc/swt.c | 2 ++ test/fixedbugs/issue9731.go | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 test/fixedbugs/issue9731.go diff --git a/src/cmd/gc/swt.c b/src/cmd/gc/swt.c index e1d8af8786..ca5455d479 100644 --- a/src/cmd/gc/swt.c +++ b/src/cmd/gc/swt.c @@ -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 index 0000000000..286cebd7b6 --- /dev/null +++ b/test/fixedbugs/issue9731.go @@ -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 { + } + }() + } +} -- 2.50.0