Fix ast_logic_not handling to be unary, not binary.
authorEric Anholt <eric@anholt.net>
Thu, 1 Apr 2010 02:50:55 +0000 (16:50 -1000)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 2 Apr 2010 18:22:41 +0000 (11:22 -0700)
ast_to_hir.cpp

index ca5ae86..3166a75 100644 (file)
@@ -726,7 +726,6 @@ ast_expression::hir(exec_list *instructions,
    case ast_logic_and:
    case ast_logic_xor:
    case ast_logic_or:
-   case ast_logic_not:
       op[0] = this->subexpressions[0]->hir(instructions, state);
       op[1] = this->subexpressions[1]->hir(instructions, state);
 
@@ -748,6 +747,20 @@ ast_expression::hir(exec_list *instructions,
                                 op[0], op[1]);
       break;
 
+   case ast_logic_not:
+      op[0] = this->subexpressions[0]->hir(instructions, state);
+
+      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
+        YYLTYPE loc = this->subexpressions[0]->get_location();
+
+        _mesa_glsl_error(& loc, state,
+                         "operand of `!' must be scalar boolean");
+      }
+
+      result = new ir_expression(operations[this->oper], glsl_type::bool_type,
+                                op[0], NULL);
+      break;
+
    case ast_mul_assign:
    case ast_div_assign:
    case ast_add_assign: