]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: fix object path for grouped declaration statements
authorMark Freeman <mark@golang.org>
Wed, 19 Nov 2025 20:10:24 +0000 (15:10 -0500)
committerGopher Robot <gobot@golang.org>
Wed, 19 Nov 2025 21:38:11 +0000 (13:38 -0800)
CL 715840 deferred popping from the object path during handling of
grouped declaration statements, which leaves extra objects on the
path since this executes in a loop.

Surprisingly, no test exercised this. This change fixes this small
bug and adds a supporting test.

Fixes #76366

Change-Id: I7fc038b39d3871eea3e60855c46614b463bcfa4f
Reviewed-on: https://go-review.googlesource.com/c/go/+/722060
Reviewed-by: Robert Griesemer <gri@google.com>
Auto-Submit: Mark Freeman <markfreeman@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/cmd/compile/internal/types2/decl.go
src/go/types/decl.go
src/internal/types/testdata/fixedbugs/issue76366.go [new file with mode: 0644]

index 2df34f3b946f50e8693c19841d94554d92928246..60371651ab0b687de9bc7efa89b0bcfe64445600 100644 (file)
@@ -876,8 +876,8 @@ func (check *Checker) declStmt(list []syntax.Decl) {
                        scopePos := s.Name.Pos()
                        check.declare(check.scope, s.Name, obj, scopePos)
                        check.push(obj) // mark as grey
-                       defer check.pop()
                        check.typeDecl(obj, s, nil)
+                       check.pop()
 
                default:
                        check.errorf(s, InvalidSyntaxTree, "unknown syntax.Decl node %T", s)
index 05cc63e01c8286d506dd1ed926d91bfdf40568c3..4b374fb66dfa147b7bf6177ef28628995598b067 100644 (file)
@@ -935,8 +935,8 @@ func (check *Checker) declStmt(d ast.Decl) {
                        scopePos := d.spec.Name.Pos()
                        check.declare(check.scope, d.spec.Name, obj, scopePos)
                        check.push(obj) // mark as grey
-                       defer check.pop()
                        check.typeDecl(obj, d.spec, nil)
+                       check.pop()
                default:
                        check.errorf(d.node(), InvalidSyntaxTree, "unknown ast.Decl node %T", d.node())
                }
diff --git a/src/internal/types/testdata/fixedbugs/issue76366.go b/src/internal/types/testdata/fixedbugs/issue76366.go
new file mode 100644 (file)
index 0000000..b78aa44
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2025 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 p
+
+func _() {
+       type (
+               A = int
+               B = []A
+       )
+}