Skip to content

Commit

Permalink
cmd/compile: fix typecheck type alias makes wrong export symbol metadata
Browse files Browse the repository at this point in the history
typecheck type alias always replaces the original definition of the symbol.
This is wrong behavior because if the symbol's definition is replaced by a
local type alias, it ends up being written to compiled file as an alias,
instead of the original type.

To fix, only replace the definition of symbol with global type alias.

Fixes #31959

Change-Id: Id85a15e8a9d6a4b06727e655a95dc81e63df633a
Reviewed-on: https://go-review.googlesource.com/c/go/+/177378
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
  • Loading branch information
cuonglm authored and mdempsky committed May 21, 2019
1 parent 1d1ba85 commit 2d357d8
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/cmd/compile/internal/gc/typecheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -3671,7 +3671,11 @@ func typecheckdef(n *Node) {
n.SetDiag(true)
goto ret
}
n.Sym.Def = asTypesNode(p.Ntype)
// For package-level type aliases, set n.Sym.Def so we can identify
// it as a type alias during export. See also #31959.
if n.Name.Curfn == nil {
n.Sym.Def = asTypesNode(p.Ntype)
}
}
break
}
Expand Down
12 changes: 12 additions & 0 deletions test/fixedbugs/issue31959.dir/a.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright 2019 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 a

type T struct{}

func F() {
type T = int
println(T(0))
}
21 changes: 21 additions & 0 deletions test/fixedbugs/issue31959.dir/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// run

// Copyright 2019 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.

// Check import package contains type alias in function
// with the same name with an export type not panic

package main

import (
"fmt"

"a"
)

func main() {
fmt.Println(a.T{})
a.F()
}
7 changes: 7 additions & 0 deletions test/fixedbugs/issue31959.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// rundir

// Copyright 2019 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 ignored
2 changes: 2 additions & 0 deletions test/fixedbugs/issue31959.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{}
0

0 comments on commit 2d357d8

Please # to comment.