]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: avoid unpacking single-value LHS
authorRobert Griesemer <gri@golang.org>
Mon, 20 Mar 2023 21:29:05 +0000 (14:29 -0700)
committerGopher Robot <gobot@golang.org>
Tue, 21 Mar 2023 21:48:20 +0000 (21:48 +0000)
For ++/-- statements, we know that syntax.AssignStmt.Lhs is a
single expression. Avoid unpacking (and allocating a slice) in
that case. Minor optimization.

Change-Id: I6615fd12277b1cd7d4f8b86e0b9d39f27708c13e
Reviewed-on: https://go-review.googlesource.com/c/go/+/477915
Run-TryBot: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>

src/cmd/compile/internal/types2/stmt.go

index f87ef11b988ba4d4f4b2fa18c0b2d7f56ffaf874..3e5c9cb6cd988690b51bbbe8954e5ffbe4d1a6f0 100644 (file)
@@ -446,26 +446,23 @@ func (check *Checker) stmt(ctxt stmtContext, s syntax.Stmt) {
                check.assignment(&val, uch.elem, "send")
 
        case *syntax.AssignStmt:
-               lhs := unpackExpr(s.Lhs)
                if s.Rhs == nil {
                        // x++ or x--
-                       if len(lhs) != 1 {
-                               check.errorf(s, InvalidSyntaxTree, "%s%s requires one operand", s.Op, s.Op)
-                               return
-                       }
+                       // (no need to call unpackExpr as s.Lhs must be single-valued)
                        var x operand
-                       check.expr(&x, lhs[0])
+                       check.expr(&x, s.Lhs)
                        if x.mode == invalid {
                                return
                        }
                        if !allNumeric(x.typ) {
-                               check.errorf(lhs[0], NonNumericIncDec, invalidOp+"%s%s%s (non-numeric type %s)", lhs[0], s.Op, s.Op, x.typ)
+                               check.errorf(s.Lhs, NonNumericIncDec, invalidOp+"%s%s%s (non-numeric type %s)", s.Lhs, s.Op, s.Op, x.typ)
                                return
                        }
-                       check.assignVar(lhs[0], &x)
+                       check.assignVar(s.Lhs, &x)
                        return
                }
 
+               lhs := unpackExpr(s.Lhs)
                rhs := unpackExpr(s.Rhs)
                switch s.Op {
                case 0: