Commit 88076ebc authored by Cuong Manh Le's avatar Cuong Manh Le Committed by Robert Griesemer

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 <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 0b739fd4
......@@ -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()
......
......@@ -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)
})
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment