Robert Griesemer, Rob Pike, Ken Thompson
----
-(May 14, 2008)
+(June 6, 2008)
This document is a semi-informal specification/proposal for a new
systems programming language. The document is under active
If statements have the traditional form except that the
condition need not be parenthesized and the "then" statement
-must be in brace brackets.
+must be in brace brackets. The condition may be omitted in which
+case it is assumed to have the value "true".
- IfStat = "if" [ SimpleStat ";" ] Expression Block [ "else" Statement ] .
+ IfStat = "if" [ [ SimpleStat ";" ] Expression ] Block [ "else" Statement ] .
if x > 0 {
return true;
}
-
-An if statement may include the declaration of a single temporary variable.
+
+An "if" statement may include the declaration of a single temporary variable.
The scope of the declared variable extends to the end of the if statement, and
-the variable is initialized once before the statement is entered.
+the variable is initialized once before the statement is entered. If a variable
+is declared, the condition cannot be omitted.
if x := f(); x < y {
return x;
return 6;
}
-func f7(a int) (int, float) {
+func f7(a int) (x int, y float) {
return 7, 7.0;
}
-func f8(a int) (a int, b float) {
+func f8(a int) (x int, y float) {
return 8, 8.0;
}
--- /dev/null
+// errchk $G $F.go
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func f1(a int) (int, float) { // BUG multiple return values must have names
+ return 7, 7.0;
+}
+
+
+func f2(a int) (a int, b float) { // BUG return value names must be different from parameter names
+ return 8, 8.0;
+}
main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
BUG: known to fail incorrectly
+=========== ./func1.go
+BUG: known to succeed incorrectly
+
=========== ./hashmap.go
hashmap.go:46: fatal error: optoas: no entry LSH-<uint32>UINT32
BUG: known to fail incorrectly
=========== ./if.go
+=========== ./if1.go
+BUG: known to succeed incorrectly
+
=========== ./int_lit.go
int_lit.go:5: syntax error
BUG: known to fail incorrectly
=========== ./switch.go
+=========== ./switch1.go
+BUG: known to succeed incorrectly
+
=========== ./test0.go
test0.go:23: addtyp: renaming Point/<Point>{<x><int32>INT32;<y><int32>INT32;} to Point2/<Point2>FORW
test0.go:48: illegal types for operand
assertequal(count, 1, "if empty");
count = 0;
- if one := 1; {
+ if one := 1; true {
count = count + one;
}
assertequal(count, 1, "if empty one");
--- /dev/null
+// $G $F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func main() {
+ count := 0;
+ if one := 1; { // BUG if there is a simple stat, the condition must be present
+ count = count + one;
+ }
+}
case i5 > x: assert(false, ">");
}
- switch x := 5; { // BUG?: true should not be necessary but now made mandatory in go_lang.txt
+ switch x := 5; true {
case i5 < x: assert(false, "<");
case i5 == x: assert(true, "!");
case i5 > x: assert(false, ">");
--- /dev/null
+// $G $F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func main() {
+ i := 0;
+ switch x := 5; { // BUG if there is a simple stat, the condition must be present
+ case i < x:
+ case i == x:
+ case i > x:
+ }
+}