Skip to content

Commit

Permalink
[release-branch.go1.18] cmd/compile/internal/types2: use correct valu…
Browse files Browse the repository at this point in the history
…e of iota

Fixes #52441.

Change-Id: I5cbf8c448dba037e9e0c5fe8f209401d6bf7d43f
Reviewed-on: https://go-review.googlesource.com/c/go/+/401134
Reviewed-by: Ian Lance Taylor <[email protected]>
Reviewed-by: Robert Griesemer <[email protected]>
Reviewed-on: https://go-review.googlesource.com/c/go/+/401174
TryBot-Result: Gopher Robot <[email protected]>
Run-TryBot: Robert Griesemer <[email protected]>
  • Loading branch information
griesemer authored and dmitshur committed May 2, 2022
1 parent 24fcbb9 commit 94274d0
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/types2/decl.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/types2/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
19 changes: 19 additions & 0 deletions src/cmd/compile/internal/types2/testdata/check/const0.src
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 19 additions & 0 deletions src/go/types/testdata/check/const0.src
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
39 changes: 39 additions & 0 deletions test/fixedbugs/issue52438.go
Original file line number Diff line number Diff line change
@@ -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)
}
}

0 comments on commit 94274d0

Please sign in to comment.