location));
}
-// IfStat = "if" [ [ SimpleStat ] ";" ] [ Condition ]
-// Block [ "else" Statement ] .
+// IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" Statement ] .
void
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());
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)
{
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();
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.
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
+++ /dev/null
-// $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)
-}
package main
func main() {
- if {} else L1: ;
- if {} else L2: main() ;
+ if true {} else L1: ;
+ if true {} else L2: main() ;
}
/*
// bug219.go:16: syntax error near if
func g1() {
if x := f(func() {
- if {}
- }); {
+ if true {}
+ }); true {
_ = x;
}
}
// this works
func g2() {
if x := f(func() {
- //if {}
- }); {
+ //if true {}
+ }); true {
_ = x;
}
}
// this works
func g3() {
x := f(func() {
- if {}
+ if true {}
});
- if {
+ if true {
_ = x;
}
}
}
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
+++ /dev/null
-// $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)
- }
-}
+++ /dev/null
-// $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");
-}