OSDN Git Service

compiler: Correct type of expressions involving character constants.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Jan 2012 19:33:52 +0000 (19:33 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Jan 2012 19:33:52 +0000 (19:33 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183490 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/expressions.cc

index 447e652..423df9c 100644 (file)
@@ -5556,7 +5556,9 @@ Binary_expression::do_lower(Gogo* gogo, Named_object*,
        Expression* ret = NULL;
        if (left_type != right_type
            && left_type != NULL
+           && !left_type->is_abstract()
            && right_type != NULL
+           && !right_type->is_abstract()
            && left_type->base() != right_type->base()
            && op != OPERATOR_LSHIFT
            && op != OPERATOR_RSHIFT)
@@ -5608,7 +5610,27 @@ Binary_expression::do_lower(Gogo* gogo, Named_object*,
                  type = right_type;
                else
                  type = left_type;
-               ret = Expression::make_integer(&val, type, location);
+
+               bool is_character = false;
+               if (type == NULL)
+                 {
+                   Type* t = this->left_->type();
+                   if (t->integer_type() != NULL
+                       && t->integer_type()->is_rune())
+                     is_character = true;
+                   else if (op != OPERATOR_LSHIFT && op != OPERATOR_RSHIFT)
+                     {
+                       t = this->right_->type();
+                       if (t->integer_type() != NULL
+                           && t->integer_type()->is_rune())
+                         is_character = true;
+                     }
+                 }
+
+               if (is_character)
+                 ret = Expression::make_character(&val, type, location);
+               else
+                 ret = Expression::make_integer(&val, type, location);
              }
 
            mpz_clear(val);
@@ -6252,6 +6274,12 @@ Binary_expression::do_type()
          return left_type;
        else if (right_type->float_type() != NULL)
          return right_type;
+       else if (left_type->integer_type() != NULL
+                && left_type->integer_type()->is_rune())
+         return left_type;
+       else if (right_type->integer_type() != NULL
+                && right_type->integer_type()->is_rune())
+         return right_type;
        else
          return left_type;
       }