mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.typeparams] all: merge dev.regabi (77365c5) into dev.typeparams
Conflicts: - src/cmd/compile/internal/gc/main.go - test/fixedbugs/issue15055.go Merge List: + 2021-01-0577365c5ed7[dev.regabi] cmd/compile: add Name.Canonical and move Byval + 2021-01-05e09783cbc0[dev.regabi] cmd/compile: make ir.StaticValue safer + 2021-01-059aa950c407[dev.regabi] cmd/compile: make ir.OuterValue safer + 2021-01-05eb626409d1[dev.regabi] cmd/compile: simplify CaptureVars + 2021-01-05c28ca67a96[dev.regabi] cmd/compile: fix ir.Dump for []*CaseClause, etc + 2021-01-04f24e40c14a[dev.regabi] cmd/compile: remove Name.Class_ accessors + 2021-01-04d89705e087[dev.regabi] cmd/compile: fix re-export of parameters + 2021-01-04290b4154b7[dev.regabi] cmd/compile: fix ICE due to large uint64 constants + 2021-01-04a30fd52884[dev.regabi] cmd/compile: use ir.NewNameAt in SubstArgTypes + 2021-01-038fc44cf0fa[dev.regabi] cmd/compile: remove a couple CloneName calls + 2021-01-03907a4bfdc7[dev.regabi] cmd/compile: fix map assignment order + 2021-01-03f2e6dab048[dev.regabi] cmd/compile: remove walkReturn "common case" path + 2021-01-03d36a6bf44d[dev.regabi] cmd/compile: improve walkReturn common case + 2021-01-03a317067d65[dev.regabi] cmd/compile: improve ascompatee + 2021-01-035d80a590a2[dev.regabi] cmd/compile: simplify walkReturn + 2021-01-03bb1b6c95c2[dev.regabi] cmd/compile: remove Node.{,Set}Walkdef + 2021-01-0357c426c9a5[dev.regabi] cmd/compile: tighten typecheckdef to *ir.Name + 2021-01-03b1747756e3[dev.regabi] cmd/compile: reorganize escape analysis somewhat + 2021-01-02f2538033c0[dev.regabi] cmd/compile: remove Nodes.Set [generated] + 2021-01-022f2d4b4e68[dev.regabi] cmd/compile: remove {Ptr,Set}Init from Node interface + 2021-01-011544a03198[dev.regabi] cmd/compile: refactor redundant type conversion [generated] + 2021-01-017958a23ea3[dev.regabi] cmd/compile: use *ir.Name where possible in inl.go + 2021-01-01bfa97ba48f[dev.regabi] test: add another closure test case + 2021-01-0167ad695416[dev.regabi] cmd/compile: split escape analysis state + 2021-01-01fad9a8b528[dev.regabi] cmd/compile: simplify inlining of closures + 2021-01-017d55669847[dev.regabi] cmd/compile: simplify dwarfgen.declPos + 2021-01-019ed1577779[dev.regabi] cmd/compile: remove Func.ClosureEnter + 2021-01-01ece345aa69[dev.regabi] cmd/compile: expand documentation for Func.Closure{Vars,Enter} + 2021-01-016ddbc75efd[dev.regabi] cmd/compile: earlier deadcode removal + 2021-01-0168e6fa4f68[dev.regabi] cmd/compile: fix package-initialization order + 2021-01-013a4474cdfd[dev.regabi] cmd/compile: some more manual shuffling + 2021-01-010f1d2129c4[dev.regabi] cmd/compile: reshuffle type-checking code [generated] + 2021-01-01b8fd3440cd[dev.regabi] cmd/compile: report unused variables during typecheck + 2021-01-01fd22df9905[dev.regabi] cmd/compile: remove idempotent Name() calls [generated] + 2020-12-31dfbcff80c6[dev.regabi] cmd/compile: make copyExpr return *ir.Name directly + 2020-12-3177fd81a3e6[dev.regabi] cmd/compile: use names for keep alive variables in function call + 2020-12-318fe1197654[dev.regabi] cmd/compile: remove Name.orig + 2020-12-31477b049060[dev.regabi] cmd/compile: fix printing of method expressions + 2020-12-30178c667db2[dev.regabi] cmd/compile: fix OSLICEARR comments + 2020-12-30f0d99def5b[dev.regabi] cmd/compile: add newline to ir.Dump + 2020-12-30451693af71[dev.regabi] cmd/compile: simplify typecheckdef + 2020-12-300c1a899a6c[dev.regabi] cmd/compile: fix defined-pointer method call check + 2020-12-30f9b67f76a5[dev.regabi] cmd/compile: change ir.DoChildren to use bool result type + 2020-12-30499851bac8[dev.regabi] cmd/compile: generalize ir/mknode.go + 2020-12-3082ab3d1448[dev.regabi] cmd/compile: use *ir.Name for Decl.X + 2020-12-309958b7ed3e[dev.regabi] cmd/compile: unexport ir.FmtNode + 2020-12-29f5816624cd[dev.regabi] cmd/compile: change AddrExpr.Alloc to AddrExpr.Prealloc + 2020-12-29850aa7c60c[dev.regabi] cmd/compile: use *ir.Name instead of ir.Node for CaseClause.Var + 2020-12-2937babc97bb[dev.regabi] cmd/compile: allow visitor visits *ir.Name + 2020-12-295cf3c87fa6[dev.regabi] cmd/compile: generate case/comm clause functions in mknode.go + 2020-12-29b3e1ec97fd[dev.regabi] cmd/compile: move new addrtaken bit back to the old name + 2020-12-290620c674dd[dev.regabi] cmd/compile: remove original addrtaken bit + 2020-12-290523d525ae[dev.regabi] cmd/compile: separate out address taken computation from typechecker + 2020-12-299ea272e5ec[dev.regabi] cmd/compile: simplify ir.Func somewhat + 2020-12-29e40cb4d4ae[dev.regabi] cmd/compile: remove more unused code + 2020-12-296f30c95048[dev.regabi] cmd/compile: remove unneeded indirection + 2020-12-29171fc6f223[dev.regabi] cmd/compile: remove workarounds for go/constant issues + 2020-12-2933801cdc62[dev.regabi] cmd/compile: use Ntype where possible + 2020-12-2982ad3083f8[dev.regabi] cmd/compile: remove typ from AssignOpStmt + 2020-12-29e34c44a7c4[dev.regabi] cmd/compile: refactoring typecheck arith + 2020-12-29a5ec920160[dev.regabi] cmd/compile: more Linksym cleanup + 2020-12-29ec59b197d5[dev.regabi] cmd/compile: rewrite to use linksym helpers [generated] + 2020-12-2925c613c02d[dev.regabi] cmd/compile: add Linksym helpers + 2020-12-29289da2b33e[dev.regabi] cmd/compile: move Node.Opt to Name + 2020-12-296acbae4fcc[dev.regabi] cmd/compile: address some ir TODOs + 2020-12-294629f6a51d[dev.regabi] cmd/compile: merge {Selector,CallPart,Method}Expr + 2020-12-29e563715b30[dev.regabi] cmd/compile: remove Sym.Importdef + 2020-12-293f370b75fb[dev.regabi] cmd/compile: cleanup //go:generate directives Change-Id: Ibb254630924ac5873ebda6762ceb066f54a82649
This commit is contained in:
commit
a8fe098a12
88 changed files with 3411 additions and 2776 deletions
|
|
@ -28,6 +28,26 @@ import (
|
|||
"cmd/internal/src"
|
||||
)
|
||||
|
||||
func LoadPackage(filenames []string) {
|
||||
base.Timer.Start("fe", "parse")
|
||||
lines := ParseFiles(filenames)
|
||||
base.Timer.Stop()
|
||||
base.Timer.AddEvent(int64(lines), "lines")
|
||||
|
||||
if base.Flag.G != 0 && base.Flag.G < 3 {
|
||||
// can only parse generic code for now
|
||||
base.ExitIfErrors()
|
||||
return
|
||||
}
|
||||
|
||||
// Typecheck.
|
||||
Package()
|
||||
|
||||
// With all user code typechecked, it's now safe to verify unused dot imports.
|
||||
CheckDotImports()
|
||||
base.ExitIfErrors()
|
||||
}
|
||||
|
||||
// ParseFiles concurrently parses files into *syntax.File structures.
|
||||
// Each declaration in every *syntax.File is converted to a syntax tree
|
||||
// and its root represented by *Node is appended to Target.Decls.
|
||||
|
|
@ -170,6 +190,69 @@ func ParseFiles(filenames []string) (lines uint) {
|
|||
return
|
||||
}
|
||||
|
||||
func Package() {
|
||||
typecheck.DeclareUniverse()
|
||||
|
||||
typecheck.TypecheckAllowed = true
|
||||
|
||||
// Process top-level declarations in phases.
|
||||
|
||||
// Phase 1: const, type, and names and types of funcs.
|
||||
// This will gather all the information about types
|
||||
// and methods but doesn't depend on any of it.
|
||||
//
|
||||
// We also defer type alias declarations until phase 2
|
||||
// to avoid cycles like #18640.
|
||||
// TODO(gri) Remove this again once we have a fix for #25838.
|
||||
|
||||
// Don't use range--typecheck can add closures to Target.Decls.
|
||||
base.Timer.Start("fe", "typecheck", "top1")
|
||||
for i := 0; i < len(typecheck.Target.Decls); i++ {
|
||||
n := typecheck.Target.Decls[i]
|
||||
if op := n.Op(); op != ir.ODCL && op != ir.OAS && op != ir.OAS2 && (op != ir.ODCLTYPE || !n.(*ir.Decl).X.Alias()) {
|
||||
typecheck.Target.Decls[i] = typecheck.Stmt(n)
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 2: Variable assignments.
|
||||
// To check interface assignments, depends on phase 1.
|
||||
|
||||
// Don't use range--typecheck can add closures to Target.Decls.
|
||||
base.Timer.Start("fe", "typecheck", "top2")
|
||||
for i := 0; i < len(typecheck.Target.Decls); i++ {
|
||||
n := typecheck.Target.Decls[i]
|
||||
if op := n.Op(); op == ir.ODCL || op == ir.OAS || op == ir.OAS2 || op == ir.ODCLTYPE && n.(*ir.Decl).X.Alias() {
|
||||
typecheck.Target.Decls[i] = typecheck.Stmt(n)
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 3: Type check function bodies.
|
||||
// Don't use range--typecheck can add closures to Target.Decls.
|
||||
base.Timer.Start("fe", "typecheck", "func")
|
||||
var fcount int64
|
||||
for i := 0; i < len(typecheck.Target.Decls); i++ {
|
||||
n := typecheck.Target.Decls[i]
|
||||
if n.Op() == ir.ODCLFUNC {
|
||||
typecheck.FuncBody(n.(*ir.Func))
|
||||
fcount++
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 4: Check external declarations.
|
||||
// TODO(mdempsky): This should be handled when type checking their
|
||||
// corresponding ODCL nodes.
|
||||
base.Timer.Start("fe", "typecheck", "externdcls")
|
||||
for i, n := range typecheck.Target.Externs {
|
||||
if n.Op() == ir.ONAME {
|
||||
typecheck.Target.Externs[i] = typecheck.Expr(typecheck.Target.Externs[i])
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 5: With all user code type-checked, it's now safe to verify map keys.
|
||||
typecheck.CheckMapKeys()
|
||||
|
||||
}
|
||||
|
||||
// Temporary import helper to get type2-based type-checking going.
|
||||
type gcimports struct {
|
||||
packages map[string]*types2.Package
|
||||
|
|
@ -301,7 +384,7 @@ func (p *noder) funcBody(fn *ir.Func, block *syntax.BlockStmt) {
|
|||
if body == nil {
|
||||
body = []ir.Node{ir.NewBlockStmt(base.Pos, nil)}
|
||||
}
|
||||
fn.Body.Set(body)
|
||||
fn.Body = body
|
||||
|
||||
base.Pos = p.makeXPos(block.Rbrace)
|
||||
fn.Endlineno = base.Pos
|
||||
|
|
@ -530,8 +613,48 @@ func (p *noder) varDecl(decl *syntax.VarDecl) []ir.Node {
|
|||
p.checkUnused(pragma)
|
||||
}
|
||||
|
||||
var init []ir.Node
|
||||
p.setlineno(decl)
|
||||
return typecheck.DeclVars(names, typ, exprs)
|
||||
|
||||
if len(names) > 1 && len(exprs) == 1 {
|
||||
as2 := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, exprs)
|
||||
for _, v := range names {
|
||||
as2.Lhs.Append(v)
|
||||
typecheck.Declare(v, typecheck.DeclContext)
|
||||
v.Ntype = typ
|
||||
v.Defn = as2
|
||||
if ir.CurFunc != nil {
|
||||
init = append(init, ir.NewDecl(base.Pos, ir.ODCL, v))
|
||||
}
|
||||
}
|
||||
|
||||
return append(init, as2)
|
||||
}
|
||||
|
||||
for i, v := range names {
|
||||
var e ir.Node
|
||||
if i < len(exprs) {
|
||||
e = exprs[i]
|
||||
}
|
||||
|
||||
typecheck.Declare(v, typecheck.DeclContext)
|
||||
v.Ntype = typ
|
||||
|
||||
if ir.CurFunc != nil {
|
||||
init = append(init, ir.NewDecl(base.Pos, ir.ODCL, v))
|
||||
}
|
||||
as := ir.NewAssignStmt(base.Pos, v, e)
|
||||
init = append(init, as)
|
||||
if e != nil || ir.CurFunc == nil {
|
||||
v.Defn = as
|
||||
}
|
||||
}
|
||||
|
||||
if len(exprs) != 0 && len(names) != len(exprs) {
|
||||
base.Errorf("assignment mismatch: %d variables but %d values", len(names), len(exprs))
|
||||
}
|
||||
|
||||
return init
|
||||
}
|
||||
|
||||
// constState tracks state between constant specifiers within a
|
||||
|
|
@ -657,7 +780,8 @@ func (p *noder) funcDecl(fun *syntax.FuncDecl) ir.Node {
|
|||
name = ir.BlankNode.Sym() // filled in by typecheckfunc
|
||||
}
|
||||
|
||||
f.Nname = ir.NewFuncNameAt(p.pos(fun.Name), name, f)
|
||||
f.Nname = ir.NewNameAt(p.pos(fun.Name), name)
|
||||
f.Nname.Func = f
|
||||
f.Nname.Defn = f
|
||||
f.Nname.Ntype = t
|
||||
|
||||
|
|
@ -787,7 +911,7 @@ func (p *noder) expr(expr syntax.Expr) ir.Node {
|
|||
for i, e := range l {
|
||||
l[i] = p.wrapname(expr.ElemList[i], e)
|
||||
}
|
||||
n.List.Set(l)
|
||||
n.List = l
|
||||
base.Pos = p.makeXPos(expr.Rbrace)
|
||||
return n
|
||||
case *syntax.KeyValueExpr:
|
||||
|
|
@ -1143,8 +1267,8 @@ func (p *noder) stmtFall(stmt syntax.Stmt, fallOK bool) ir.Node {
|
|||
if list, ok := stmt.Lhs.(*syntax.ListExpr); ok && len(list.ElemList) != 1 || len(rhs) != 1 {
|
||||
n := ir.NewAssignListStmt(p.pos(stmt), ir.OAS2, nil, nil)
|
||||
n.Def = stmt.Op == syntax.Def
|
||||
n.Lhs.Set(p.assignList(stmt.Lhs, n, n.Def))
|
||||
n.Rhs.Set(rhs)
|
||||
n.Lhs = p.assignList(stmt.Lhs, n, n.Def)
|
||||
n.Rhs = rhs
|
||||
return n
|
||||
}
|
||||
|
||||
|
|
@ -1191,10 +1315,10 @@ func (p *noder) stmtFall(stmt syntax.Stmt, fallOK bool) ir.Node {
|
|||
n := ir.NewReturnStmt(p.pos(stmt), p.exprList(stmt.Results))
|
||||
if len(n.Results) == 0 && ir.CurFunc != nil {
|
||||
for _, ln := range ir.CurFunc.Dcl {
|
||||
if ln.Class_ == ir.PPARAM {
|
||||
if ln.Class == ir.PPARAM {
|
||||
continue
|
||||
}
|
||||
if ln.Class_ != ir.PPARAMOUT {
|
||||
if ln.Class != ir.PPARAMOUT {
|
||||
break
|
||||
}
|
||||
if ln.Sym().Def != ln {
|
||||
|
|
@ -1215,7 +1339,7 @@ func (p *noder) stmtFall(stmt syntax.Stmt, fallOK bool) ir.Node {
|
|||
panic("unhandled Stmt")
|
||||
}
|
||||
|
||||
func (p *noder) assignList(expr syntax.Expr, defn ir.Node, colas bool) []ir.Node {
|
||||
func (p *noder) assignList(expr syntax.Expr, defn ir.InitNode, colas bool) []ir.Node {
|
||||
if !colas {
|
||||
return p.exprList(expr)
|
||||
}
|
||||
|
|
@ -1291,7 +1415,7 @@ func (p *noder) ifStmt(stmt *syntax.IfStmt) ir.Node {
|
|||
e := p.stmt(stmt.Else)
|
||||
if e.Op() == ir.OBLOCK {
|
||||
e := e.(*ir.BlockStmt)
|
||||
n.Else.Set(e.List)
|
||||
n.Else = e.List
|
||||
} else {
|
||||
n.Else = []ir.Node{e}
|
||||
}
|
||||
|
|
@ -1316,7 +1440,7 @@ func (p *noder) forStmt(stmt *syntax.ForStmt) ir.Node {
|
|||
n.Value = lhs[1]
|
||||
}
|
||||
}
|
||||
n.Body.Set(p.blockStmt(stmt.Body))
|
||||
n.Body = p.blockStmt(stmt.Body)
|
||||
p.closeAnotherScope()
|
||||
return n
|
||||
}
|
||||
|
|
@ -1374,7 +1498,7 @@ func (p *noder) caseClauses(clauses []*syntax.CaseClause, tswitch *ir.TypeSwitch
|
|||
body = body[:len(body)-1]
|
||||
}
|
||||
|
||||
n.Body.Set(p.stmtsFall(body, true))
|
||||
n.Body = p.stmtsFall(body, true)
|
||||
if l := len(n.Body); l > 0 && n.Body[l-1].Op() == ir.OFALL {
|
||||
if tswitch != nil {
|
||||
base.Errorf("cannot fallthrough in type switch")
|
||||
|
|
@ -1875,7 +1999,9 @@ func (p *noder) funcLit(expr *syntax.FuncLit) ir.Node {
|
|||
|
||||
fn := ir.NewFunc(p.pos(expr))
|
||||
fn.SetIsHiddenClosure(ir.CurFunc != nil)
|
||||
fn.Nname = ir.NewFuncNameAt(p.pos(expr), ir.BlankNode.Sym(), fn) // filled in by typecheckclosure
|
||||
|
||||
fn.Nname = ir.NewNameAt(p.pos(expr), ir.BlankNode.Sym()) // filled in by typecheckclosure
|
||||
fn.Nname.Func = fn
|
||||
fn.Nname.Ntype = xtype
|
||||
fn.Nname.Defn = fn
|
||||
|
||||
|
|
@ -1965,18 +2091,18 @@ func oldname(s *types.Sym) ir.Node {
|
|||
// the := it looks like a reference to the outer x so we'll
|
||||
// make x a closure variable unnecessarily.
|
||||
n := n.(*ir.Name)
|
||||
c := n.Name().Innermost
|
||||
c := n.Innermost
|
||||
if c == nil || c.Curfn != ir.CurFunc {
|
||||
// Do not have a closure var for the active closure yet; make one.
|
||||
c = typecheck.NewName(s)
|
||||
c.Class_ = ir.PAUTOHEAP
|
||||
c.Class = ir.PAUTOHEAP
|
||||
c.SetIsClosureVar(true)
|
||||
c.Defn = n
|
||||
|
||||
// Link into list of active closure variables.
|
||||
// Popped from list in func funcLit.
|
||||
c.Outer = n.Name().Innermost
|
||||
n.Name().Innermost = c
|
||||
c.Outer = n.Innermost
|
||||
n.Innermost = c
|
||||
|
||||
ir.CurFunc.ClosureVars = append(ir.CurFunc.ClosureVars, c)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue