From fd68e6ba7254ebe7feeeafe1fd6686b2ada8eeff Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 24 Mar 2011 00:40:21 +0000 Subject: [PATCH] Condition in if statement is not optional. From-SVN: r171377 --- gcc/go/gofrontend/parse.cc | 6 +- gcc/go/gofrontend/statements.cc | 35 +++---- .../go.test/test/fixedbugs/bug001.go | 11 --- .../go.test/test/fixedbugs/bug140.go | 4 +- .../go.test/test/fixedbugs/bug219.go | 12 +-- gcc/testsuite/go.test/test/if.go | 12 --- gcc/testsuite/go.test/test/if1.go | 20 ---- gcc/testsuite/go.test/test/ken/robif.go | 97 ------------------- 8 files changed, 21 insertions(+), 176 deletions(-) delete mode 100644 gcc/testsuite/go.test/test/fixedbugs/bug001.go delete mode 100644 gcc/testsuite/go.test/test/if1.go delete mode 100644 gcc/testsuite/go.test/test/ken/robif.go diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc index 2e591495684..e6588997f53 100644 --- a/gcc/go/gofrontend/parse.cc +++ b/gcc/go/gofrontend/parse.cc @@ -3703,8 +3703,7 @@ Parse::return_stat() location)); } -// IfStat = "if" [ [ SimpleStat ] ";" ] [ Condition ] -// Block [ "else" Statement ] . +// IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" Statement ] . void Parse::if_stat() @@ -3728,8 +3727,7 @@ Parse::if_stat() { 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 --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc index 5a4ad061329..0a6ef8cea95 100644 --- a/gcc/go/gofrontend/statements.cc +++ b/gcc/go/gofrontend/statements.cc @@ -2956,12 +2956,8 @@ class If_statement : public Statement 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 @@ If_statement::do_traverse(Traverse* traverse) 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 @@ If_statement::do_determine_types() 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 @@ If_statement::do_may_fall_through() const 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 diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug001.go b/gcc/testsuite/go.test/test/fixedbugs/bug001.go deleted file mode 100644 index 2df8791fffb..00000000000 --- a/gcc/testsuite/go.test/test/fixedbugs/bug001.go +++ /dev/null @@ -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) -} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug140.go b/gcc/testsuite/go.test/test/fixedbugs/bug140.go index 33d1deb8a0c..298081663b4 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug140.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug140.go @@ -7,8 +7,8 @@ package main func main() { - if {} else L1: ; - if {} else L2: main() ; + if true {} else L1: ; + if true {} else L2: main() ; } /* diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug219.go b/gcc/testsuite/go.test/test/fixedbugs/bug219.go index 21361a2aab3..966d3fcf31a 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug219.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug219.go @@ -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; } } diff --git a/gcc/testsuite/go.test/test/if.go b/gcc/testsuite/go.test/test/if.go index db1fe8b7907..c1bb69d277f 100644 --- a/gcc/testsuite/go.test/test/if.go +++ b/gcc/testsuite/go.test/test/if.go @@ -44,18 +44,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 diff --git a/gcc/testsuite/go.test/test/if1.go b/gcc/testsuite/go.test/test/if1.go deleted file mode 100644 index 061c36411ed..00000000000 --- a/gcc/testsuite/go.test/test/if1.go +++ /dev/null @@ -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) - } -} diff --git a/gcc/testsuite/go.test/test/ken/robif.go b/gcc/testsuite/go.test/test/ken/robif.go deleted file mode 100644 index b6fe4e4330b..00000000000 --- a/gcc/testsuite/go.test/test/ken/robif.go +++ /dev/null @@ -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"); -} -- 2.30.2