go: require { } around else block

R=gri, ken, r
CC=golang-dev
https://golang.org/cl/4721044
diff --git a/doc/go_spec.html b/doc/go_spec.html
index 489ad4d..9865238 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -3762,7 +3762,7 @@
 </p>
 
 <pre class="ebnf">
-IfStmt    = "if" [ SimpleStmt ";" ] Expression Block [ "else" Statement ] .
+IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] .
 </pre>
 
 <pre>
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index 01a4e82..d3e363d 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -1462,6 +1462,9 @@
 	}
 |	if_stmt LELSE stmt
 	{
+		if($3->op != OIF && $3->op != OBLOCK)
+			yyerror("missing { } after else");
+
 		popdcl();
 		$$ = $1;
 		$$->nelse = list1($3);
diff --git a/test/if.go b/test/if.go
index c1bb69d..18a6715 100644
--- a/test/if.go
+++ b/test/if.go
@@ -53,25 +53,28 @@
 	count = 0
 	if true {
 		count = count + 1
-	} else
+	} else {
 		count = count - 1
+	}
 	assertequal(count, 1, "if else true")
 
 	count = 0
 	if false {
 		count = count + 1
-	} else
+	} else {
 		count = count - 1
+	}
 	assertequal(count, -1, "if else false")
 
 	count = 0
-	if t:=1; false {
+	if t := 1; false {
 		count = count + 1
 		_ = t
 		t := 7
 		_ = t
-	} else
+	} else {
 		count = count - t
+	}
 	assertequal(count, -1, "if else false var")
 
 	count = 0
@@ -80,8 +83,9 @@
 		count = count + 1
 		t := 7
 		_ = t
-	} else
+	} else {
 		count = count - t
+	}
 	_ = t
 	assertequal(count, -1, "if else false var outside")
 }