From 16dd0624c204ced87ea950b129c5c26d82e2aad4 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 1 Feb 2017 15:13:48 -0800 Subject: [PATCH] cmd/compile/internal/gc: add comment and test for #15550 When switching to the new parser, I changed cmd/compile to handle iota per an intuitive interpretation of how nested constant declarations should work (which also matches go/types). Note: if we end up deciding that the current spec wording is intentional (i.e., confirming gccgo's current behavior), the test will need to be updated to expect 4 instead of 1. Updates #15550. Change-Id: I441f5f13209f172b73ef75031f2a9daa5e985277 Reviewed-on: https://go-review.googlesource.com/36122 Reviewed-by: David Crawshaw Reviewed-by: Robert Griesemer Reviewed-by: Josh Bleecher Snyder Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/noder.go | 3 +++ test/fixedbugs/issue15550.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 test/fixedbugs/issue15550.go diff --git a/src/cmd/compile/internal/gc/noder.go b/src/cmd/compile/internal/gc/noder.go index 912652110c..482578d10a 100644 --- a/src/cmd/compile/internal/gc/noder.go +++ b/src/cmd/compile/internal/gc/noder.go @@ -204,6 +204,9 @@ func (p *noder) varDecl(decl *syntax.VarDecl) []*Node { return variter(names, typ, exprs) } +// constState tracks state between constant specifiers within a +// declaration group. This state is kept separate from noder so nested +// constant declarations are handled correctly (e.g., issue 15550). type constState struct { group *syntax.Group typ *Node diff --git a/test/fixedbugs/issue15550.go b/test/fixedbugs/issue15550.go new file mode 100644 index 0000000000..f2853fc48b --- /dev/null +++ b/test/fixedbugs/issue15550.go @@ -0,0 +1,28 @@ +// run + +// Copyright 2017 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 + +import "unsafe" + +const ( + _ = unsafe.Sizeof(func() int { + const ( + _ = 1 + _ + _ + ) + return 0 + }()) + + y = iota +) + +func main() { + if y != 1 { + panic(y) + } +} -- 2.50.0