This patch from Chris Manghane changes the Go frontend to use the
backend interface for bound method expressions.  Bootstrapped and ran Go
testsuite on x86_64-unknown-linux-gnu.  Committed to mainline.

Ian

diff -r e828f77c32b7 go/expressions.cc
--- a/go/expressions.cc	Thu May 01 15:18:08 2014 -0400
+++ b/go/expressions.cc	Mon May 05 12:54:14 2014 -0400
@@ -6736,12 +6736,9 @@
   Expression* ret = Expression::make_struct_composite_literal(st, vals, loc);
   ret = Expression::make_heap_expression(ret, loc);
 
-  tree ret_tree = ret->get_tree(context);
+  // See whether the expression or any embedded pointers are nil.
 
   Expression* nil_check = NULL;
-
-  // See whether the expression or any embedded pointers are nil.
-
   Expression* expr = this->expr_;
   if (this->method_->field_indexes() != NULL)
     {
@@ -6764,26 +6761,19 @@
 	nil_check = Expression::make_binary(OPERATOR_OROR, nil_check, n, loc);
     }
 
+  Bexpression* bme = tree_to_expr(ret->get_tree(context));
   if (nil_check != NULL)
     {
-      tree nil_check_tree = nil_check->get_tree(context);
-      Expression* crash_expr =
-	context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
-      tree crash = crash_expr->get_tree(context);
-      if (ret_tree == error_mark_node
-	  || nil_check_tree == error_mark_node
-	  || crash == error_mark_node)
-	return error_mark_node;
-
-      ret_tree = fold_build2_loc(loc.gcc_location(), COMPOUND_EXPR,
-				 TREE_TYPE(ret_tree),
-				 build3_loc(loc.gcc_location(), COND_EXPR,
-					    void_type_node, nil_check_tree,
-					    crash, NULL_TREE),
-				 ret_tree);
-    }
-
-  return ret_tree;
+      Gogo* gogo = context->gogo();
+      Expression* crash =
+	gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
+      Bexpression* bcrash = tree_to_expr(crash->get_tree(context));
+      Btype* btype = ret->type()->get_backend(gogo);
+      Bexpression* bcheck = tree_to_expr(nil_check->get_tree(context));
+      bme = gogo->backend()->conditional_expression(btype, bcheck, bcrash,
+						    bme, loc);
+    }
+  return expr_to_tree(bme);
 }
 
 // Dump ast representation of a bound method expression.

Reply via email to