Condition in if statement is not optional.

From-SVN: r171377
This commit is contained in:
Ian Lance Taylor 2011-03-24 00:40:21 +00:00
parent 5278672ca1
commit fd68e6ba72
8 changed files with 21 additions and 176 deletions

View File

@ -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());

View File

@ -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

View File

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

View File

@ -7,8 +7,8 @@
package main
func main() {
if {} else L1: ;
if {} else L2: main() ;
if true {} else L1: ;
if true {} else L2: main() ;
}
/*

View File

@ -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;
}
}

View File

@ -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

View File

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

View File

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