aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/compile/internal/ir/expr.go7
-rw-r--r--src/cmd/compile/internal/noder/expr.go2
-rw-r--r--src/cmd/compile/internal/noder/helpers.go9
3 files changed, 14 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/ir/expr.go b/src/cmd/compile/internal/ir/expr.go
index 65ed3cff66..2d62b22d8c 100644
--- a/src/cmd/compile/internal/ir/expr.go
+++ b/src/cmd/compile/internal/ir/expr.go
@@ -740,6 +740,13 @@ func IsAddressable(n Node) bool {
case ODEREF, ODOTPTR:
return true
+ case OXDOT:
+ // TODO(danscales): remove this case as we remove calls to the old
+ // typechecker in (*irgen).funcBody().
+ if base.Flag.G == 0 {
+ return false
+ }
+ fallthrough
case ODOT:
n := n.(*SelectorExpr)
return IsAddressable(n.X)
diff --git a/src/cmd/compile/internal/noder/expr.go b/src/cmd/compile/internal/noder/expr.go
index 06aa91199c..989ebf236e 100644
--- a/src/cmd/compile/internal/noder/expr.go
+++ b/src/cmd/compile/internal/noder/expr.go
@@ -188,7 +188,7 @@ func (g *irgen) expr0(typ types2.Type, expr syntax.Expr) ir.Node {
// than in typecheck.go.
func (g *irgen) selectorExpr(pos src.XPos, typ types2.Type, expr *syntax.SelectorExpr) ir.Node {
x := g.expr(expr.X)
- if x.Type().Kind() == types.TTYPEPARAM {
+ if x.Type().HasTParam() {
// Leave a method call on a type param as an OXDOT, since it can
// only be fully transformed once it has an instantiated type.
n := ir.NewSelectorExpr(pos, ir.OXDOT, x, typecheck.Lookup(expr.Sel.Value))
diff --git a/src/cmd/compile/internal/noder/helpers.go b/src/cmd/compile/internal/noder/helpers.go
index 4cb6bc3eab..2b084ff311 100644
--- a/src/cmd/compile/internal/noder/helpers.go
+++ b/src/cmd/compile/internal/noder/helpers.go
@@ -54,8 +54,11 @@ func Nil(pos src.XPos, typ *types.Type) ir.Node {
// Expressions
func Addr(pos src.XPos, x ir.Node) *ir.AddrExpr {
- // TODO(mdempsky): Avoid typecheck.Expr. Probably just need to set OPTRLIT when appropriate.
- n := typecheck.Expr(typecheck.NodAddrAt(pos, x)).(*ir.AddrExpr)
+ n := typecheck.NodAddrAt(pos, x)
+ switch x.Op() {
+ case ir.OARRAYLIT, ir.OMAPLIT, ir.OSLICELIT, ir.OSTRUCTLIT:
+ n.SetOp(ir.OPTRLIT)
+ }
typed(types.NewPtr(x.Type()), n)
return n
}
@@ -125,7 +128,7 @@ func Call(pos src.XPos, typ *types.Type, fun ir.Node, args []ir.Node, dots bool)
n.IsDDD = dots
if fun.Op() == ir.OXDOT {
- if fun.(*ir.SelectorExpr).X.Type().Kind() != types.TTYPEPARAM {
+ if !fun.(*ir.SelectorExpr).X.Type().HasTParam() {
base.FatalfAt(pos, "Expecting type param receiver in %v", fun)
}
// For methods called in a generic function, don't do any extra