diff --git a/doc/go_spec.html b/doc/go_spec.html index 489ad4db36..9865238718 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -3762,7 +3762,7 @@ present, the "else" branch is executed.

-IfStmt    = "if" [ SimpleStmt ";" ] Expression Block [ "else" Statement ] .
+IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] .
 
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index 01a4e822fb..d3e363d370 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -1462,6 +1462,9 @@ non_dcl_stmt:
 	}
 |	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 c1bb69d277..18a6715d7e 100644
--- a/test/if.go
+++ b/test/if.go
@@ -53,25 +53,28 @@ func main() {
 	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 @@ func main() {
 		count = count + 1
 		t := 7
 		_ = t
-	} else
+	} else {
 		count = count - t
+	}
 	_ = t
 	assertequal(count, -1, "if else false var outside")
 }