From b3f00c6985a28073c8ac20369597c2e982f4ef68 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 28 Feb 2018 11:22:05 -0800 Subject: [PATCH] cmd/compile: fix unexpected type alias crash OCOMPLIT stores the pre-typechecked type in n.Right, and then moves it to n.Type. However, it wasn't clearing n.Right, so n.Right continued to point to the OTYPE node. (Exception: slice literals reused n.Right to store the array length.) When exporting inline function bodies, we don't expect to need to save any type aliases. Doing so wouldn't be wrong per se, but it's completely unnecessary and would just bloat the export data. However, reexportdep (whose role is to identify types needed by inline function bodies) uses a generic tree traversal mechanism, which visits n.Right even for O{ARRAY,MAP,STRUCT}LIT nodes. This means it finds the OTYPE node, and mistakenly interpreted that the type alias needs to be exported. The straight forward fix is to just clear n.Right when typechecking composite literals. Fixes #24173. Change-Id: Ia2d556bfdd806c83695b08e18b6cd71eff0772fc Reviewed-on: https://go-review.googlesource.com/97719 Run-TryBot: Matthew Dempsky Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/typecheck.go | 5 ++++- test/fixedbugs/issue24173.go | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue24173.go diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 562c37f24d..a1653d0e7f 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -2992,10 +2992,11 @@ func typecheckcomplit(n *Node) *Node { t.SetNumElem(length) } if t.IsSlice() { - n.Right = nodintconst(length) n.Op = OSLICELIT + n.Right = nodintconst(length) } else { n.Op = OARRAYLIT + n.Right = nil } case TMAP: @@ -3025,6 +3026,7 @@ func typecheckcomplit(n *Node) *Node { } n.Op = OMAPLIT + n.Right = nil case TSTRUCT: // Need valid field offsets for Xoffset below. @@ -3126,6 +3128,7 @@ func typecheckcomplit(n *Node) *Node { } n.Op = OSTRUCTLIT + n.Right = nil } if nerr != nerrors { diff --git a/test/fixedbugs/issue24173.go b/test/fixedbugs/issue24173.go new file mode 100644 index 0000000000..4c19e05ef0 --- /dev/null +++ b/test/fixedbugs/issue24173.go @@ -0,0 +1,19 @@ +// compile + +// Copyright 2018 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 + +type arrayAlias = [10]int +type mapAlias = map[int]int +type sliceAlias = []int +type structAlias = struct{} + +func Exported() { + _ = arrayAlias{} + _ = mapAlias{} + _ = sliceAlias{} + _ = structAlias{} +} -- 2.48.1