compiler: Fix comparison of struct/array with interface.
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 29 Aug 2014 03:06:15 +0000 (03:06 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 29 Aug 2014 03:06:15 +0000 (03:06 +0000)
The compiler used to crash when the struct/array was not
addressable.

The test case is https://codereview.appspot.com/135170043 .

This fixes http://golang.org/issue/8612 .

From-SVN: r214713

gcc/go/gofrontend/expressions.cc

index f7a3c57bcb39be04b48c3022e8db9cc98b50b9db..6414136fed01b7d2484e1af614c339e8e534b695 100644 (file)
@@ -5187,10 +5187,13 @@ Binary_expression::do_lower(Gogo* gogo, Named_object*,
   // Lower struct, array, and some interface comparisons.
   if (op == OPERATOR_EQEQ || op == OPERATOR_NOTEQ)
     {
-      if (left->type()->struct_type() != NULL)
+      if (left->type()->struct_type() != NULL
+         && right->type()->struct_type() != NULL)
        return this->lower_struct_comparison(gogo, inserter);
       else if (left->type()->array_type() != NULL
-              && !left->type()->is_slice_type())
+              && !left->type()->is_slice_type()
+              && right->type()->array_type() != NULL
+              && !right->type()->is_slice_type())
        return this->lower_array_comparison(gogo, inserter);
       else if ((left->type()->interface_type() != NULL
                 && right->type()->interface_type() == NULL)