aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/typecheck/typecheck.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2020-12-29 03:34:57 -0800
committerMatthew Dempsky <mdempsky@google.com>2020-12-30 05:00:09 +0000
commit451693af71a9d64f7f71a311d7076c8545672f88 (patch)
treecaa96f814d01de877887cf3b3aa4e8018f0f0d6e /src/cmd/compile/internal/typecheck/typecheck.go
parent0c1a899a6c61dc59032ead0602d1cc6b918f7669 (diff)
downloadgo-451693af71a9d64f7f71a311d7076c8545672f88.tar.gz
go-451693af71a9d64f7f71a311d7076c8545672f88.zip
[dev.regabi] cmd/compile: simplify typecheckdef
Reorganize code to be a little clearer. Also allows tightening typecheckdefstack from []ir.Node to []*ir.Name. Passes toolstash -cmp. Change-Id: I43df1a5e2a72dd3423b132d3afe363bf76700269 Reviewed-on: https://go-review.googlesource.com/c/go/+/280649 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Diffstat (limited to 'src/cmd/compile/internal/typecheck/typecheck.go')
-rw-r--r--src/cmd/compile/internal/typecheck/typecheck.go83
1 files changed, 36 insertions, 47 deletions
diff --git a/src/cmd/compile/internal/typecheck/typecheck.go b/src/cmd/compile/internal/typecheck/typecheck.go
index b79739bfeb..cf9b48f5a6 100644
--- a/src/cmd/compile/internal/typecheck/typecheck.go
+++ b/src/cmd/compile/internal/typecheck/typecheck.go
@@ -246,7 +246,7 @@ const (
// marks variables that escape the local frame.
// rewrites n.Op to be more specific in some cases.
-var typecheckdefstack []ir.Node
+var typecheckdefstack []*ir.Name
// Resolve ONONAME to definition, if any.
func Resolve(n ir.Node) (res ir.Node) {
@@ -584,24 +584,9 @@ func indexlit(n ir.Node) ir.Node {
// typecheck1 should ONLY be called from typecheck.
func typecheck1(n ir.Node, top int) ir.Node {
switch n.Op() {
- case ir.OLITERAL, ir.ONAME, ir.ONONAME, ir.OTYPE:
- if n.Sym() == nil {
- return n
- }
-
- if n.Op() == ir.ONAME {
- n := n.(*ir.Name)
- if n.BuiltinOp != 0 && top&ctxCallee == 0 {
- base.Errorf("use of builtin %v not in function call", n.Sym())
- n.SetType(nil)
- return n
- }
- }
-
- typecheckdef(n)
- if n.Op() == ir.ONONAME {
- n.SetType(nil)
- return n
+ case ir.OLITERAL, ir.ONAME, ir.OTYPE:
+ if n.Sym() != nil {
+ typecheckdef(n)
}
}
@@ -611,22 +596,37 @@ func typecheck1(n ir.Node, top int) ir.Node {
base.Fatalf("typecheck %v", n.Op())
panic("unreachable")
- // names
case ir.OLITERAL:
- if n.Type() == nil && n.Val().Kind() == constant.String {
- base.Fatalf("string literal missing type")
+ if n.Sym() == nil && n.Type() == nil {
+ base.Fatalf("literal missing type: %v", n)
}
return n
- case ir.ONIL, ir.ONONAME:
+ case ir.ONIL:
+ return n
+
+ // names
+ case ir.ONONAME:
+ if !n.Diag() {
+ // Note: adderrorname looks for this string and
+ // adds context about the outer expression
+ base.ErrorfAt(n.Pos(), "undefined: %v", n.Sym())
+ n.SetDiag(true)
+ }
+ n.SetType(nil)
return n
case ir.ONAME:
n := n.(*ir.Name)
- if n.Name().Decldepth == 0 {
- n.Name().Decldepth = decldepth
+ if n.Decldepth == 0 {
+ n.Decldepth = decldepth
}
if n.BuiltinOp != 0 {
+ if top&ctxCallee == 0 {
+ base.Errorf("use of builtin %v not in function call", n.Sym())
+ n.SetType(nil)
+ return n
+ }
return n
}
if top&ctxAssign == 0 {
@@ -652,9 +652,6 @@ func typecheck1(n ir.Node, top int) ir.Node {
// types (ODEREF is with exprs)
case ir.OTYPE:
- if n.Type() == nil {
- return n
- }
return n
case ir.OTSLICE:
@@ -1852,26 +1849,22 @@ func typecheckdef(n ir.Node) {
defer tracePrint("typecheckdef", n)(nil)
}
- lno := ir.SetPos(n)
-
- if n.Op() == ir.ONONAME {
- if !n.Diag() {
- n.SetDiag(true)
-
- // Note: adderrorname looks for this string and
- // adds context about the outer expression
- base.ErrorfAt(base.Pos, "undefined: %v", n.Sym())
- }
- base.Pos = lno
+ if n.Walkdef() == 1 {
return
}
- if n.Walkdef() == 1 {
- base.Pos = lno
+ if n.Type() != nil { // builtin
+ // Mark as Walkdef so that if n.SetType(nil) is called later, we
+ // won't try walking again.
+ if got := n.Walkdef(); got != 0 {
+ base.Fatalf("unexpected walkdef: %v", got)
+ }
+ n.SetWalkdef(1)
return
}
- typecheckdefstack = append(typecheckdefstack, n)
+ lno := ir.SetPos(n)
+ typecheckdefstack = append(typecheckdefstack, n.(*ir.Name))
if n.Walkdef() == 2 {
base.FlushErrors()
fmt.Printf("typecheckdef loop:")
@@ -1885,10 +1878,6 @@ func typecheckdef(n ir.Node) {
n.SetWalkdef(2)
- if n.Type() != nil || n.Sym() == nil { // builtin or no name
- goto ret
- }
-
switch n.Op() {
default:
base.Fatalf("typecheckdef %v", n.Op())
@@ -2367,7 +2356,7 @@ func deadcodeexpr(n ir.Node) ir.Node {
func getIotaValue() int64 {
if i := len(typecheckdefstack); i > 0 {
if x := typecheckdefstack[i-1]; x.Op() == ir.OLITERAL {
- return x.(*ir.Name).Iota()
+ return x.Iota()
}
}