mirror of
https://github.com/golang/go
synced 2024-11-18 14:04:45 -07:00
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: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
0b739fd4df
commit
88076ebc92
@ -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()
|
||||
|
14
src/go/types/testdata/const0.src
vendored
14
src/go/types/testdata/const0.src
vendored
@ -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)
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user