The Go language used to permit omitting the condition from an if statement. This was useless, but was permitted by analogy with a for statement. This useless feature has now been removed. This patch removes it from the gccgo frontend, and adjusts some tests to match. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r bed5c6bbeeb9 go/parse.cc --- a/go/parse.cc Wed Mar 23 16:53:20 2011 -0700 +++ b/go/parse.cc Wed Mar 23 17:28:56 2011 -0700 @@ -3703,8 +3703,7 @@ location)); } -// IfStat = "if" [ [ SimpleStat ] ";" ] [ Condition ] -// Block [ "else" Statement ] . +// IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" Statement ] . void Parse::if_stat() @@ -3728,8 +3727,7 @@ { if (this->peek_token()->is_op(OPERATOR_SEMICOLON)) this->advance_token(); - if (!this->peek_token()->is_op(OPERATOR_LCURLY)) - cond = this->expression(PRECEDENCE_NORMAL, false, false, NULL); + cond = this->expression(PRECEDENCE_NORMAL, false, false, NULL); } this->gogo_->start_block(this->location()); diff -r bed5c6bbeeb9 go/statements.cc --- a/go/statements.cc Wed Mar 23 16:53:20 2011 -0700 +++ b/go/statements.cc Wed Mar 23 17:28:56 2011 -0700 @@ -2956,12 +2956,8 @@ int If_statement::do_traverse(Traverse* traverse) { - if (this->cond_ != NULL) - { - if (this->traverse_expression(traverse, &this->cond_) == TRAVERSE_EXIT) - return TRAVERSE_EXIT; - } - if (this->then_block_->traverse(traverse) == TRAVERSE_EXIT) + if (this->traverse_expression(traverse, &this->cond_) == TRAVERSE_EXIT + || this->then_block_->traverse(traverse) == TRAVERSE_EXIT) return TRAVERSE_EXIT; if (this->else_block_ != NULL) { @@ -2974,11 +2970,8 @@ void If_statement::do_determine_types() { - if (this->cond_ != NULL) - { - Type_context context(Type::lookup_bool_type(), false); - this->cond_->determine_type(&context); - } + Type_context context(Type::lookup_bool_type(), false); + this->cond_->determine_type(&context); this->then_block_->determine_types(); if (this->else_block_ != NULL) this->else_block_->determine_types(); @@ -2989,14 +2982,11 @@ void If_statement::do_check_types(Gogo*) { - if (this->cond_ != NULL) - { - Type* type = this->cond_->type(); - if (type->is_error_type()) - this->set_is_error(); - else if (!type->is_boolean_type()) - this->report_error(_("expected boolean expression")); - } + Type* type = this->cond_->type(); + if (type->is_error_type()) + this->set_is_error(); + else if (!type->is_boolean_type()) + this->report_error(_("expected boolean expression")); } // Whether the overall statement may fall through. @@ -3014,12 +3004,9 @@ tree If_statement::do_get_tree(Translate_context* context) { - gcc_assert(this->cond_ == NULL - || this->cond_->type()->is_boolean_type() + gcc_assert(this->cond_->type()->is_boolean_type() || this->cond_->type()->is_error_type()); - tree cond_tree = (this->cond_ == NULL - ? boolean_true_node - : this->cond_->get_tree(context)); + tree cond_tree = this->cond_->get_tree(context); tree then_tree = this->then_block_->get_tree(context); tree else_tree = (this->else_block_ == NULL ? NULL_TREE Index: gcc/testsuite/go.test/test/if1.go =================================================================== --- gcc/testsuite/go.test/test/if1.go (revision 171359) +++ gcc/testsuite/go.test/test/if1.go (working copy) @@ -1,20 +0,0 @@ -// $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 - -import "os" - -func main() { - count := 7 - if one := 1; { - count = count + one - } - if count != 8 { - print(count, " should be 8\n") - os.Exit(1) - } -} Index: gcc/testsuite/go.test/test/ken/robif.go =================================================================== --- gcc/testsuite/go.test/test/ken/robif.go (revision 171359) +++ gcc/testsuite/go.test/test/ken/robif.go (working copy) @@ -1,97 +0,0 @@ -// $G $D/$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 assertequal(is, shouldbe int, msg string) { - if is != shouldbe { - print("assertion fail" + msg + "\n"); - panic(1); - } -} - -func main() { - i5 := 5; - i7 := 7; - - var count int; - - count = 0; - if true { - count = count + 1; - } - assertequal(count, 1, "if true"); - - count = 0; - if false { - count = count + 1; - } - assertequal(count, 0, "if false"); - - count = 0; - if one := 1; true { - count = count + one; - } - assertequal(count, 1, "if true one"); - - count = 0; - if one := 1; false { - _ = one; - count = count + 1; - } - assertequal(count, 0, "if false one"); - - count = 0; - if { - count = count + 1; - } - assertequal(count, 1, "if empty"); - - count = 0; - if one := 1; { - count = count + one; - } - assertequal(count, 1, "if empty one"); - - count = 0; - if i5 < i7 { - count = count + 1; - } - assertequal(count, 1, "if cond"); - - count = 0; - if true { - count = count + 1; - } else - count = count - 1; - assertequal(count, 1, "if else true"); - - count = 0; - if false { - count = count + 1; - } else - count = count - 1; - assertequal(count, -1, "if else false"); - - count = 0; - if t:=1; false { - count = count + 1; - t := 7; - _ = t; - } else - count = count - t; - assertequal(count, -1, "if else false var"); - - count = 0; - t := 1; - if false { - count = count + 1; - t := 7; - _ = t; - } else - count = count - t; - assertequal(count, -1, "if else false var outside"); -} Index: gcc/testsuite/go.test/test/fixedbugs/bug001.go =================================================================== --- gcc/testsuite/go.test/test/fixedbugs/bug001.go (revision 171359) +++ gcc/testsuite/go.test/test/fixedbugs/bug001.go (working copy) @@ -1,11 +0,0 @@ -// $G $D/$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() { - if {} // compiles; should be an error (must be an expression) -} Index: gcc/testsuite/go.test/test/fixedbugs/bug140.go =================================================================== --- gcc/testsuite/go.test/test/fixedbugs/bug140.go (revision 171359) +++ gcc/testsuite/go.test/test/fixedbugs/bug140.go (working copy) @@ -7,8 +7,8 @@ package main func main() { - if {} else L1: ; - if {} else L2: main() ; + if true {} else L1: ; + if true {} else L2: main() ; } /* Index: gcc/testsuite/go.test/test/fixedbugs/bug219.go =================================================================== --- gcc/testsuite/go.test/test/fixedbugs/bug219.go (revision 171359) +++ gcc/testsuite/go.test/test/fixedbugs/bug219.go (working copy) @@ -12,8 +12,8 @@ func f(func()) int { return 0 } // bug219.go:16: syntax error near if func g1() { if x := f(func() { - if {} - }); { + if true {} + }); true { _ = x; } } @@ -21,8 +21,8 @@ func g1() { // this works func g2() { if x := f(func() { - //if {} - }); { + //if true {} + }); true { _ = x; } } @@ -30,9 +30,9 @@ func g2() { // this works func g3() { x := f(func() { - if {} + if true {} }); - if { + if true { _ = x; } } Index: gcc/testsuite/go.test/test/if.go =================================================================== --- gcc/testsuite/go.test/test/if.go (revision 171359) +++ gcc/testsuite/go.test/test/if.go (working copy) @@ -45,18 +45,6 @@ func main() { assertequal(count, 0, "if false one") count = 0 - if { - count = count + 1 - } - assertequal(count, 1, "if empty") - - count = 0 - if one := 1; true { - count = count + one - } - assertequal(count, 1, "if empty one") - - count = 0 if i5 < i7 { count = count + 1 }