diff options
author | Robert Griesemer <gri@golang.org> | 2022-04-19 13:46:15 -0700 |
---|---|---|
committer | Dmitri Shuralyov <dmitshur@golang.org> | 2022-05-02 20:59:21 +0000 |
commit | 94274d0ffdfea0773f57d83a7f862e63e19350a9 (patch) | |
tree | 4a5ac99c6ca9f27edf7448db35921bde0060fcc5 | |
parent | 24fcbb98080d1aea7d2ab101c3633a2fe2cda8c5 (diff) | |
download | go-94274d0ffdfea0773f57d83a7f862e63e19350a9.tar.gz go-94274d0ffdfea0773f57d83a7f862e63e19350a9.zip |
[release-branch.go1.18] cmd/compile/internal/types2: use correct value of iota
Fixes #52441.
Change-Id: I5cbf8c448dba037e9e0c5fe8f209401d6bf7d43f
Reviewed-on: https://go-review.googlesource.com/c/go/+/401134
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/401174
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
-rw-r--r-- | src/cmd/compile/internal/types2/decl.go | 2 | ||||
-rw-r--r-- | src/cmd/compile/internal/types2/resolver.go | 2 | ||||
-rw-r--r-- | src/cmd/compile/internal/types2/testdata/check/const0.src | 19 | ||||
-rw-r--r-- | src/go/types/testdata/check/const0.src | 19 | ||||
-rw-r--r-- | test/fixedbugs/issue52438.go | 39 |
5 files changed, 79 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/types2/decl.go b/src/cmd/compile/internal/types2/decl.go index 579fa55e59..17453f31fa 100644 --- a/src/cmd/compile/internal/types2/decl.go +++ b/src/cmd/compile/internal/types2/decl.go @@ -735,7 +735,7 @@ func (check *Checker) declStmt(list []syntax.Decl) { top := len(check.delayed) // iota is the index of the current constDecl within the group - if first < 0 || list[index-1].(*syntax.ConstDecl).Group != s.Group { + if first < 0 || s.Group == nil || list[index-1].(*syntax.ConstDecl).Group != s.Group { first = index last = nil } diff --git a/src/cmd/compile/internal/types2/resolver.go b/src/cmd/compile/internal/types2/resolver.go index 61963cb043..10dd86fea2 100644 --- a/src/cmd/compile/internal/types2/resolver.go +++ b/src/cmd/compile/internal/types2/resolver.go @@ -339,7 +339,7 @@ func (check *Checker) collectObjects() { case *syntax.ConstDecl: // iota is the index of the current constDecl within the group - if first < 0 || file.DeclList[index-1].(*syntax.ConstDecl).Group != s.Group { + if first < 0 || s.Group == nil || file.DeclList[index-1].(*syntax.ConstDecl).Group != s.Group { first = index last = nil } diff --git a/src/cmd/compile/internal/types2/testdata/check/const0.src b/src/cmd/compile/internal/types2/testdata/check/const0.src index 3cffdf904c..229c248643 100644 --- a/src/cmd/compile/internal/types2/testdata/check/const0.src +++ b/src/cmd/compile/internal/types2/testdata/check/const0.src @@ -349,6 +349,25 @@ const _ = unsafe.Sizeof(func() { assert(iota == 0) }) +// issue #52438 +const i1 = iota +const i2 = iota +const i3 = iota + +func _() { + assert(i1 == 0) + assert(i2 == 0) + assert(i3 == 0) + + const i4 = iota + const i5 = iota + const i6 = iota + + assert(i4 == 0) + assert(i5 == 0) + assert(i6 == 0) +} + // untyped constants must not get arbitrarily large const prec = 512 // internal maximum precision for integers const maxInt = (1<<(prec/2) - 1) * (1<<(prec/2) + 1) // == 1<<prec - 1 diff --git a/src/go/types/testdata/check/const0.src b/src/go/types/testdata/check/const0.src index 3cffdf904c..229c248643 100644 --- a/src/go/types/testdata/check/const0.src +++ b/src/go/types/testdata/check/const0.src @@ -349,6 +349,25 @@ const _ = unsafe.Sizeof(func() { assert(iota == 0) }) +// issue #52438 +const i1 = iota +const i2 = iota +const i3 = iota + +func _() { + assert(i1 == 0) + assert(i2 == 0) + assert(i3 == 0) + + const i4 = iota + const i5 = iota + const i6 = iota + + assert(i4 == 0) + assert(i5 == 0) + assert(i6 == 0) +} + // untyped constants must not get arbitrarily large const prec = 512 // internal maximum precision for integers const maxInt = (1<<(prec/2) - 1) * (1<<(prec/2) + 1) // == 1<<prec - 1 diff --git a/test/fixedbugs/issue52438.go b/test/fixedbugs/issue52438.go new file mode 100644 index 0000000000..375e727ee3 --- /dev/null +++ b/test/fixedbugs/issue52438.go @@ -0,0 +1,39 @@ +// run + +// Copyright 2022 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 main + +const c1 = iota +const c2 = iota + +const c3 = 0 + iota<<8 +const c4 = 1 + iota<<8 + +func main() { + if c1 != 0 { + panic(c1) + } + if c2 != 0 { + panic(c2) + } + + if c3 != 0 { + panic(c3) + } + if c4 != 1 { + panic(c4) + } + + const c5 = iota + const c6 = iota + + if c5 != 0 { + panic(c5) + } + if c6 != 0 { + panic(c6) + } +} |