diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-05-07 18:24:17 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-05-07 18:24:17 +0000 |
commit | c414667bc2a1aa812048cc6f7bba291820dcf5e9 (patch) | |
tree | 0e21d73bbd2e337c743709c4ac5ecd561dd021db /gcc/go/gofrontend/expressions.cc | |
parent | 55796e90211a41667518e334812ee31001a35f54 (diff) | |
download | gcc-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/gofrontend/expressions.cc')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 9 |
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()) |