diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go
index c9f2f012826e8b8e6cd8d698231f2a0404df641a..1b423ed36c946c768ffbfc429d57b73597ffc584 100644
--- a/src/cmd/compile/internal/gc/range.go
+++ b/src/cmd/compile/internal/gc/range.go
@@ -155,27 +155,36 @@ func walkrange(n *Node) *Node {
 	lno := setlineno(a)
 	n.Right = nil
 
-	var v1 *Node
-	if n.List.Len() != 0 {
+	var v1, v2 *Node
+	l := n.List.Len()
+	if l > 0 {
 		v1 = n.List.First()
 	}
-	var v2 *Node
-	if n.List.Len() > 1 && !isblank(n.List.Second()) {
+
+	if l > 1 {
 		v2 = n.List.Second()
 	}
 
-	if v1 == nil && v2 != nil {
-		Fatalf("walkrange: v2 != nil while v1 == nil")
+	if isblank(v2) {
+		v2 = nil
 	}
 
-	var ifGuard *Node
+	if isblank(v1) && v2 == nil {
+		v1 = nil
+	}
 
-	translatedLoopOp := OFOR
+	if v1 == nil && v2 != nil {
+		Fatalf("walkrange: v2 != nil while v1 == nil")
+	}
 
 	// n.List has no meaning anymore, clear it
 	// to avoid erroneous processing by racewalk.
 	n.List.Set(nil)
 
+	var ifGuard *Node
+
+	translatedLoopOp := OFOR
+
 	var body []*Node
 	var init []*Node
 	switch t.Etype {
diff --git a/test/range.go b/test/range.go
index afdac57fa357fae4e45fd8f0ad8fef7c6ed484b3..3da7d170b58634ae907358f184b1ba15e689325e 100644
--- a/test/range.go
+++ b/test/range.go
@@ -23,12 +23,57 @@ func seq(lo, hi int) chan int {
 	return c
 }
 
+const alphabet = "abcdefghijklmnopqrstuvwxyz"
+
+func testblankvars() {
+	n := 0
+	for range alphabet {
+		n++
+	}
+	if n != 26 {
+		println("for range: wrong count", n, "want 26")
+		panic("fail")
+	}
+	n = 0
+	for _ = range alphabet {
+		n++
+	}
+	if n != 26 {
+		println("for _ = range: wrong count", n, "want 26")
+		panic("fail")
+	}
+	n = 0
+	for _, _ = range alphabet {
+		n++
+	}
+	if n != 26 {
+		println("for _, _ = range: wrong count", n, "want 26")
+		panic("fail")
+	}
+	s := 0
+	for i, _ := range alphabet {
+		s += i
+	}
+	if s != 325 {
+		println("for i, _ := range: wrong sum", s, "want 325")
+		panic("fail")
+	}
+	r := rune(0)
+	for _, v := range alphabet {
+		r += v
+	}
+	if r != 2847 {
+		println("for _, v := range: wrong sum", r, "want 2847")
+		panic("fail")
+	}
+}
+
 func testchan() {
 	s := ""
 	for i := range seq('a', 'z') {
 		s += string(i)
 	}
-	if s != "abcdefghijklmnopqrstuvwxyz" {
+	if s != alphabet {
 		println("Wanted lowercase alphabet; got", s)
 		panic("fail")
 	}
@@ -38,6 +83,7 @@ func testchan() {
 	}
 	if n != 26 {
 		println("testchan wrong count", n, "want 26")
+		panic("fail")
 	}
 }
 
@@ -426,6 +472,7 @@ func testcalls() {
 }
 
 func main() {
+	testblankvars()
 	testchan()
 	testarray()
 	testarray1()