]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: change dead code into assert
authorMatthew Dempsky <mdempsky@google.com>
Mon, 14 Dec 2015 20:37:26 +0000 (12:37 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 15 Dec 2015 18:52:01 +0000 (18:52 +0000)
After fixing #13587, I noticed that the "OAS2FUNC in disguise" block
looked like it probably needed write barriers too.  However, testing
revealed the multi-value "return f()" case was already being handled
correctly.

It turns out this block is dead code due to "return f()" already being
transformed into "t1, t2, ..., tN := f(); return t1, t2, ..., tN" by
orderstmt when f is a multi-valued function.

Updates #13587.

Change-Id: Icde46dccc55beda2ea5fd5fcafc9aae26cec1552
Reviewed-on: https://go-review.googlesource.com/17759
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/walk.go

index d4dc81a1e39cb95bdc4529a14e620cc35652c81b..25cd828b9bac300a554035c44990421371c25ee1 100644 (file)
@@ -299,6 +299,12 @@ func walkstmt(np **Node) {
                                }
                        }
 
+                       if got, want := count(n.List), count(rl); got != want {
+                               // order should have rewritten multi-value function calls
+                               // with explicit OAS2FUNC nodes.
+                               Fatalf("expected %v return arguments, have %v", want, got)
+                       }
+
                        if samelist(rl, n.List) {
                                // special return in disguise
                                n.List = nil
@@ -306,17 +312,6 @@ func walkstmt(np **Node) {
                                break
                        }
 
-                       if count(n.List) == 1 && count(rl) > 1 {
-                               // OAS2FUNC in disguise
-                               f := n.List.N
-
-                               if f.Op != OCALLFUNC && f.Op != OCALLMETH && f.Op != OCALLINTER {
-                                       Fatalf("expected return of call, have %v", f)
-                               }
-                               n.List = concat(list1(f), ascompatet(n.Op, rl, &f.Type, 0, &n.Ninit))
-                               break
-                       }
-
                        // move function calls out, to make reorder3's job easier.
                        walkexprlistsafe(n.List, &n.Ninit)