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")
}