From: Cuong Manh Le Date: Wed, 11 Sep 2019 08:51:28 +0000 (+0700) Subject: go/types: fix iota undefined after ConstDecl inside function in ConstSpec X-Git-Tag: go1.14beta1~1121 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=88076ebc92e793fa95db314c0defed5571d8ce99;p=gostls13.git 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 --- 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) +})