diff --git a/src/cmd/compile/internal/types2/check_test.go b/src/cmd/compile/internal/types2/check_test.go index 2e1ae0d2be..67540dcf2c 100644 --- a/src/cmd/compile/internal/types2/check_test.go +++ b/src/cmd/compile/internal/types2/check_test.go @@ -297,7 +297,7 @@ func TestManual(t *testing.T) { // TODO(gri) go/types has extra TestLongConstants and TestIndexRepresentability tests -func TestCheck(t *testing.T) { testDirFiles(t, "testdata/check", 55, false) } // TODO(gri) narrow column tolerance +func TestCheck(t *testing.T) { DefPredeclaredTestFuncs(); testDirFiles(t, "testdata/check", 55, false) } // TODO(gri) narrow column tolerance func TestSpec(t *testing.T) { testDirFiles(t, "testdata/spec", 0, false) } func TestExamples(t *testing.T) { testDirFiles(t, "testdata/examples", 0, false) } func TestFixedbugs(t *testing.T) { testDirFiles(t, "testdata/fixedbugs", 0, false) } diff --git a/src/cmd/compile/internal/types2/testdata/check/constdecl.go b/src/cmd/compile/internal/types2/testdata/check/constdecl.go index cb155ab35d..bb07a361fa 100644 --- a/src/cmd/compile/internal/types2/testdata/check/constdecl.go +++ b/src/cmd/compile/internal/types2/testdata/check/constdecl.go @@ -135,4 +135,26 @@ const ( f // ERROR invalid array length ) +// Test that identifiers in implicit (omitted) RHS +// expressions of constant declarations are resolved +// in the correct context; see issues #49157, #53585. +const X = 2 + +func _() { + const ( + A = iota // 0 + iota = iota // 1 + B // 1 (iota is declared locally on prev. line) + C // 1 + ) + assert(A == 0 && B == 1 && C == 1) + + const ( + X = X + X + Y + Z = iota + ) + assert(X == 4 && Y == 8 && Z == 1) +} + // TODO(gri) move extra tests from testdata/const0.src into here diff --git a/src/go/types/check_test.go b/src/go/types/check_test.go index 8765ef2e80..4684a6e296 100644 --- a/src/go/types/check_test.go +++ b/src/go/types/check_test.go @@ -372,7 +372,7 @@ func TestIssue47243_TypedRHS(t *testing.T) { testFiles(t, &StdSizes{4, 4}, []string{"p.go"}, [][]byte{[]byte(src)}, false, nil) } -func TestCheck(t *testing.T) { testDirFiles(t, "testdata/check", false) } +func TestCheck(t *testing.T) { DefPredeclaredTestFuncs(); testDirFiles(t, "testdata/check", false) } func TestSpec(t *testing.T) { testDirFiles(t, "testdata/spec", false) } func TestExamples(t *testing.T) { testDirFiles(t, "testdata/examples", false) } func TestFixedbugs(t *testing.T) { testDirFiles(t, "testdata/fixedbugs", false) } diff --git a/src/go/types/testdata/check/constdecl.go b/src/go/types/testdata/check/constdecl.go index 680c85aff3..f7a9dd43c0 100644 --- a/src/go/types/testdata/check/constdecl.go +++ b/src/go/types/testdata/check/constdecl.go @@ -138,4 +138,26 @@ const ( f // ERROR invalid array length ) +// Test that identifiers in implicit (omitted) RHS +// expressions of constant declarations are resolved +// in the correct context; see issues #49157, #53585. +const X = 2 + +func _() { + const ( + A = iota // 0 + iota = iota // 1 + B // 1 (iota is declared locally on prev. line) + C // 1 + ) + assert(A == 0 && B == 1 && C == 1) + + const ( + X = X + X + Y + Z = iota + ) + assert(X == 4 && Y == 8 && Z == 1) +} + // TODO(gri) move extra tests from testdata/const0.src into here diff --git a/test/const8.go b/test/const8.go new file mode 100644 index 0000000000..9c04cc7e2c --- /dev/null +++ b/test/const8.go @@ -0,0 +1,36 @@ +// 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. + +// Test that identifiers in implicit (omitted) RHS +// expressions of constant declarations are resolved +// in the correct context; see issues #49157, #53585. + +package main + +const X = 2 + +func main() { + const ( + A = iota // 0 + iota = iota // 1 + B // 1 (iota is declared locally on prev. line) + C // 1 + ) + if A != 0 || B != 1 || C != 1 { + println("got", A, B, C, "want 0 1 1") + panic("FAILED") + } + + const ( + X = X + X + Y + Z = iota + ) + if X != 4 || Y != 8 || Z != 1 { + println("got", X, Y, Z, "want 4 8 1") + panic("FAILED") + } +}