gc: empty select

R=ken2
CC=golang-dev
https://golang.org/cl/1871057
diff --git a/src/cmd/gc/select.c b/src/cmd/gc/select.c
index 9cba01f..2fa4353 100644
--- a/src/cmd/gc/select.c
+++ b/src/cmd/gc/select.c
@@ -68,8 +68,6 @@
 		typechecklist(ncase->nbody, Etop);
 	}
 	sel->xoffset = count;
-	if(count == 0)
-		yyerror("empty select");
 	lineno = lno;
 }
 
@@ -91,7 +89,7 @@
 	typecheck(&r, Etop);
 	init = list(init, r);
 
-	if(sel->list == nil)
+	if(sel->list == nil && sel->xoffset != 0)
 		fatal("double walkselect");	// already rewrote
 
 	// register cases
diff --git a/src/pkg/runtime/chan.c b/src/pkg/runtime/chan.c
index 9e88e82..16c02e8 100644
--- a/src/pkg/runtime/chan.c
+++ b/src/pkg/runtime/chan.c
@@ -631,9 +631,11 @@
 		printf("select: sel=%p\n", sel);
 
 	if(sel->ncase < 2) {
-		if(sel->ncase < 1)
-			throw("select: no cases");
-		// make special case of one.
+		if(sel->ncase < 1) {
+			g->status = Gwaiting;	// forever
+			gosched();
+		}
+		// TODO: make special case of one.
 	}
 
 	// select a (relative) prime
diff --git a/test/chan/select3.go b/test/chan/select3.go
index d4f7ebc..a1a2ef5 100644
--- a/test/chan/select3.go
+++ b/test/chan/select3.go
@@ -112,38 +112,33 @@
 		<-ch
 	})
 
-	// TODO(gri) remove this if once 6g accepts empty selects
-	enabled := false
-	if enabled {
-		// empty selects always block
-		testBlock(always, func() {
-			select {
-			case <-make(chan int): // remove this once 6g accepts empty selects
-			}
-		})
+	// empty selects always block
+	testBlock(always, func() {
+		select {
+		}
+	})
 
-		// selects with only nil channels always block
-		testBlock(always, func() {
-			select {
-			case <-nilch:
-				unreachable()
-			}
-		})
-		testBlock(always, func() {
-			select {
-			case nilch <- 7:
-				unreachable()
-			}
-		})
-		testBlock(always, func() {
-			select {
-			case <-nilch:
-				unreachable()
-			case nilch <- 7:
-				unreachable()
-			}
-		})
-	}
+	// selects with only nil channels always block
+	testBlock(always, func() {
+		select {
+		case <-nilch:
+			unreachable()
+		}
+	})
+	testBlock(always, func() {
+		select {
+		case nilch <- 7:
+			unreachable()
+		}
+	})
+	testBlock(always, func() {
+		select {
+		case <-nilch:
+			unreachable()
+		case nilch <- 7:
+			unreachable()
+		}
+	})
 
 	// selects with non-ready non-nil channels always block
 	testBlock(always, func() {