aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2012-05-07 18:24:17 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-05-07 18:24:17 +0000
commitc414667bc2a1aa812048cc6f7bba291820dcf5e9 (patch)
tree0e21d73bbd2e337c743709c4ac5ecd561dd021db /gcc/go
parent55796e90211a41667518e334812ee31001a35f54 (diff)
downloadgcc-c414667bc2a1aa812048cc6f7bba291820dcf5e9.zip
gcc-c414667bc2a1aa812048cc6f7bba291820dcf5e9.tar.gz
gcc-c414667bc2a1aa812048cc6f7bba291820dcf5e9.tar.bz2
compiler: reject NOT operator on integer types.
The Go specification only accepts the NOT operator on boolean types. Fixes issue 10. From-SVN: r187262
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/expressions.cc9
1 files changed, 6 insertions, 3 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index a266694..39824bf 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -3606,8 +3606,7 @@ Unary_expression::do_lower(Gogo*, Named_object*, Statement_inserter*, int)
return Expression::make_error(this->location());
}
- if (op == OPERATOR_PLUS || op == OPERATOR_MINUS
- || op == OPERATOR_NOT || op == OPERATOR_XOR)
+ if (op == OPERATOR_PLUS || op == OPERATOR_MINUS || op == OPERATOR_XOR)
{
Numeric_constant nc;
if (expr->numeric_constant_value(&nc))
@@ -3697,10 +3696,10 @@ Unary_expression::eval_constant(Operator op, const Numeric_constant* unc,
else
go_unreachable();
- case OPERATOR_NOT:
case OPERATOR_XOR:
break;
+ case OPERATOR_NOT:
case OPERATOR_AND:
case OPERATOR_MULT:
return false;
@@ -3911,6 +3910,10 @@ Unary_expression::do_check_types(Gogo*)
break;
case OPERATOR_NOT:
+ if (!type->is_boolean_type())
+ this->report_error(_("expected boolean type"));
+ break;
+
case OPERATOR_XOR:
if (type->integer_type() == NULL
&& !type->is_boolean_type())