This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Go patch committed: if statement condition is not optional


The Go language used to permit omitting the condition from an if
statement.  This was useless, but was permitted by analogy with a for
statement.  This useless feature has now been removed.  This patch
removes it from the gccgo frontend, and adjusts some tests to match.
Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
Committed to mainline.

Ian

diff -r bed5c6bbeeb9 go/parse.cc
--- a/go/parse.cc	Wed Mar 23 16:53:20 2011 -0700
+++ b/go/parse.cc	Wed Mar 23 17:28:56 2011 -0700
@@ -3703,8 +3703,7 @@
 							      location));
 }
 
-// IfStat = "if" [ [ SimpleStat ] ";" ] [ Condition ]
-//             Block [ "else" Statement ] .
+// IfStmt    = "if" [ SimpleStmt ";" ] Expression Block [ "else" Statement ] .
 
 void
 Parse::if_stat()
@@ -3728,8 +3727,7 @@
     {
       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());
diff -r bed5c6bbeeb9 go/statements.cc
--- a/go/statements.cc	Wed Mar 23 16:53:20 2011 -0700
+++ b/go/statements.cc	Wed Mar 23 17:28:56 2011 -0700
@@ -2956,12 +2956,8 @@
 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 @@
 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 @@
 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 @@
 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
Index: gcc/testsuite/go.test/test/if1.go
===================================================================
--- gcc/testsuite/go.test/test/if1.go	(revision 171359)
+++ gcc/testsuite/go.test/test/if1.go	(working copy)
@@ -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)
-	}
-}
Index: gcc/testsuite/go.test/test/ken/robif.go
===================================================================
--- gcc/testsuite/go.test/test/ken/robif.go	(revision 171359)
+++ gcc/testsuite/go.test/test/ken/robif.go	(working copy)
@@ -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");
-}
Index: gcc/testsuite/go.test/test/fixedbugs/bug001.go
===================================================================
--- gcc/testsuite/go.test/test/fixedbugs/bug001.go	(revision 171359)
+++ gcc/testsuite/go.test/test/fixedbugs/bug001.go	(working copy)
@@ -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: gcc/testsuite/go.test/test/fixedbugs/bug140.go
===================================================================
--- gcc/testsuite/go.test/test/fixedbugs/bug140.go	(revision 171359)
+++ gcc/testsuite/go.test/test/fixedbugs/bug140.go	(working copy)
@@ -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: gcc/testsuite/go.test/test/fixedbugs/bug219.go
===================================================================
--- gcc/testsuite/go.test/test/fixedbugs/bug219.go	(revision 171359)
+++ gcc/testsuite/go.test/test/fixedbugs/bug219.go	(working copy)
@@ -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: gcc/testsuite/go.test/test/if.go
===================================================================
--- gcc/testsuite/go.test/test/if.go	(revision 171359)
+++ gcc/testsuite/go.test/test/if.go	(working copy)
@@ -45,18 +45,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
 	}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]