From 88076ebc92e793fa95db314c0defed5571d8ce99 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 11 Sep 2019 15:51:28 +0700 Subject: [PATCH] go/types: fix iota undefined after ConstDecl inside function in ConstSpec When reaching const declaration, Checker override context iota to use correct iota value, but does not restore the old value when exit, and always set context iota to nil. It ends up with undefined iota after const declaration. To fix it, preserve the original iota value and restore it after const declaration. Fixes #34228 Change-Id: I42d5efb55a57e5ddc369bb72d31f1f039c92361c Reviewed-on: https://go-review.googlesource.com/c/go/+/194737 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/decl.go | 2 +- src/go/types/testdata/const0.src | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/go/types/decl.go b/src/go/types/decl.go index 1e2790a171..a13442c951 100644 --- a/src/go/types/decl.go +++ b/src/go/types/decl.go @@ -333,8 +333,8 @@ func (check *Checker) constDecl(obj *Const, typ, init ast.Expr) { assert(obj.typ == nil) // use the correct value of iota + defer func(iota constant.Value) { check.iota = iota }(check.iota) check.iota = obj.val - defer func() { check.iota = nil }() // provide valid constant value under all circumstances obj.val = constant.MakeUnknown() diff --git a/src/go/types/testdata/const0.src b/src/go/types/testdata/const0.src index 19fb1bdbbe..adbbf2863b 100644 --- a/src/go/types/testdata/const0.src +++ b/src/go/types/testdata/const0.src @@ -308,6 +308,8 @@ const ( _ = unsafe.Sizeof([iota-1]int{} == x) // assert types are equal _ = unsafe.Sizeof([Two]int{} == x) // assert types are equal ) + var z [iota]int // [2]int + _ = unsafe.Sizeof([2]int{} == z) // assert types are equal }) three = iota // the sequence continues ) @@ -334,3 +336,15 @@ var _ = []int64{ 1 * 1e9, 5 * 1e9, } + +const _ = unsafe.Sizeof(func() { + const _ = 0 + _ = iota + + const ( + zero = iota + one + ) + assert(one == 1) + assert(iota == 0) +}) -- 2.50.0