From: Ian Lance Taylor Date: Tue, 24 Jan 2012 19:33:52 +0000 (+0000) Subject: compiler: Correct type of expressions involving character constants. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fd9df055b2797a204531db1f846f7ef194bb6d0c;p=gcc.git compiler: Correct type of expressions involving character constants. From-SVN: r183490 --- diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 447e652860e..423df9c7519 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -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; }