Commit fd68e6ba by Ian Lance Taylor

Condition in if statement is not optional.

From-SVN: r171377
parent 5278672c
...@@ -3703,8 +3703,7 @@ Parse::return_stat() ...@@ -3703,8 +3703,7 @@ Parse::return_stat()
location)); location));
} }
// IfStat = "if" [ [ SimpleStat ] ";" ] [ Condition ] // IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" Statement ] .
// Block [ "else" Statement ] .
void void
Parse::if_stat() Parse::if_stat()
...@@ -3728,8 +3727,7 @@ Parse::if_stat() ...@@ -3728,8 +3727,7 @@ Parse::if_stat()
{ {
if (this->peek_token()->is_op(OPERATOR_SEMICOLON)) if (this->peek_token()->is_op(OPERATOR_SEMICOLON))
this->advance_token(); 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()); this->gogo_->start_block(this->location());
......
...@@ -2956,12 +2956,8 @@ class If_statement : public Statement ...@@ -2956,12 +2956,8 @@ class If_statement : public Statement
int int
If_statement::do_traverse(Traverse* traverse) If_statement::do_traverse(Traverse* traverse)
{ {
if (this->cond_ != NULL) if (this->traverse_expression(traverse, &this->cond_) == TRAVERSE_EXIT
{ || this->then_block_->traverse(traverse) == TRAVERSE_EXIT)
if (this->traverse_expression(traverse, &this->cond_) == TRAVERSE_EXIT)
return TRAVERSE_EXIT;
}
if (this->then_block_->traverse(traverse) == TRAVERSE_EXIT)
return TRAVERSE_EXIT; return TRAVERSE_EXIT;
if (this->else_block_ != NULL) if (this->else_block_ != NULL)
{ {
...@@ -2974,11 +2970,8 @@ If_statement::do_traverse(Traverse* traverse) ...@@ -2974,11 +2970,8 @@ If_statement::do_traverse(Traverse* traverse)
void void
If_statement::do_determine_types() 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(); this->then_block_->determine_types();
if (this->else_block_ != NULL) if (this->else_block_ != NULL)
this->else_block_->determine_types(); this->else_block_->determine_types();
...@@ -2989,14 +2982,11 @@ If_statement::do_determine_types() ...@@ -2989,14 +2982,11 @@ If_statement::do_determine_types()
void void
If_statement::do_check_types(Gogo*) If_statement::do_check_types(Gogo*)
{ {
if (this->cond_ != NULL) Type* type = this->cond_->type();
{ if (type->is_error_type())
Type* type = this->cond_->type(); this->set_is_error();
if (type->is_error_type()) else if (!type->is_boolean_type())
this->set_is_error(); this->report_error(_("expected boolean expression"));
else if (!type->is_boolean_type())
this->report_error(_("expected boolean expression"));
}
} }
// Whether the overall statement may fall through. // Whether the overall statement may fall through.
...@@ -3014,12 +3004,9 @@ If_statement::do_may_fall_through() const ...@@ -3014,12 +3004,9 @@ If_statement::do_may_fall_through() const
tree tree
If_statement::do_get_tree(Translate_context* context) If_statement::do_get_tree(Translate_context* context)
{ {
gcc_assert(this->cond_ == NULL gcc_assert(this->cond_->type()->is_boolean_type()
|| this->cond_->type()->is_boolean_type()
|| this->cond_->type()->is_error_type()); || this->cond_->type()->is_error_type());
tree cond_tree = (this->cond_ == NULL tree cond_tree = this->cond_->get_tree(context);
? boolean_true_node
: this->cond_->get_tree(context));
tree then_tree = this->then_block_->get_tree(context); tree then_tree = this->then_block_->get_tree(context);
tree else_tree = (this->else_block_ == NULL tree else_tree = (this->else_block_ == NULL
? NULL_TREE ? NULL_TREE
......
// $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)
}
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
package main package main
func main() { func main() {
if {} else L1: ; if true {} else L1: ;
if {} else L2: main() ; if true {} else L2: main() ;
} }
/* /*
......
...@@ -12,8 +12,8 @@ func f(func()) int { return 0 } ...@@ -12,8 +12,8 @@ func f(func()) int { return 0 }
// bug219.go:16: syntax error near if // bug219.go:16: syntax error near if
func g1() { func g1() {
if x := f(func() { if x := f(func() {
if {} if true {}
}); { }); true {
_ = x; _ = x;
} }
} }
...@@ -21,8 +21,8 @@ func g1() { ...@@ -21,8 +21,8 @@ func g1() {
// this works // this works
func g2() { func g2() {
if x := f(func() { if x := f(func() {
//if {} //if true {}
}); { }); true {
_ = x; _ = x;
} }
} }
...@@ -30,9 +30,9 @@ func g2() { ...@@ -30,9 +30,9 @@ func g2() {
// this works // this works
func g3() { func g3() {
x := f(func() { x := f(func() {
if {} if true {}
}); });
if { if true {
_ = x; _ = x;
} }
} }
...@@ -45,18 +45,6 @@ func main() { ...@@ -45,18 +45,6 @@ func main() {
assertequal(count, 0, "if false one") assertequal(count, 0, "if false one")
count = 0 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 { if i5 < i7 {
count = count + 1 count = count + 1
} }
......
// $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)
}
}
// $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");
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment