mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 13:31:04 +08:00
Condition in if statement is not optional.
From-SVN: r171377
This commit is contained in:
parent
5278672ca1
commit
fd68e6ba72
@ -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());
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
@ -7,8 +7,8 @@
|
||||
package main
|
||||
|
||||
func main() {
|
||||
if {} else L1: ;
|
||||
if {} else L2: main() ;
|
||||
if true {} else L1: ;
|
||||
if true {} else L2: main() ;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user