compiler: reject NOT operator on integer types.
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 7 May 2012 18:24:17 +0000 (18:24 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 7 May 2012 18:24:17 +0000 (18:24 +0000)
The Go specification only accepts the NOT operator on boolean
types.

Fixes issue 10.

From-SVN: r187262

gcc/go/gofrontend/expressions.cc

index a266694d24cf88bdc73a3f76414c44a1ff6abaa3..39824bfcb6f8cac4dce6de4d29c595c44d901063 100644 (file)
@@ -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())