Condition in if statement is not optional.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 24 Mar 2011 00:40:21 +0000 (00:40 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 24 Mar 2011 00:40:21 +0000 (00:40 +0000)
From-SVN: r171377

gcc/go/gofrontend/parse.cc
gcc/go/gofrontend/statements.cc
gcc/testsuite/go.test/test/fixedbugs/bug001.go [deleted file]
gcc/testsuite/go.test/test/fixedbugs/bug140.go
gcc/testsuite/go.test/test/fixedbugs/bug219.go
gcc/testsuite/go.test/test/if.go
gcc/testsuite/go.test/test/if1.go [deleted file]
gcc/testsuite/go.test/test/ken/robif.go [deleted file]

index 2e591495684eb5e0744b113a18a787d5f254a776..e6588997f53e7de1f4893cb745aa5236bf8c51e4 100644 (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());
index 5a4ad06132978e9426f4991afc1087afb615712a..0a6ef8cea95730edd73f5fe6df3ccccd4c8ea563 100644 (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
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug001.go b/gcc/testsuite/go.test/test/fixedbugs/bug001.go
deleted file mode 100644 (file)
index 2df8791..0000000
+++ /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)
-}
index 33d1deb8a0c9efe06902d888ae4e8e760de0c8a0..298081663b49fedad6f753794f861c475a0cec7d 100644 (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() ;
 }
 
 /*
index 21361a2aab3d353f52d1d887ae0ea17c89bc4004..966d3fcf31a8ccc5ec845044de2d23bc9e1a8329 100644 (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;
        }
 }
index db1fe8b790766ae744befcfaa01ce0f437496edd..c1bb69d277f6594687a09016406239ef8a98543b 100644 (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
diff --git a/gcc/testsuite/go.test/test/if1.go b/gcc/testsuite/go.test/test/if1.go
deleted file mode 100644 (file)
index 061c364..0000000
+++ /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 (file)
index b6fe4e4..0000000
+++ /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");
-}