mesa: glsl: additional type checking for assignments, inequalities
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 02:12:50 +0000 (20:12 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 02:57:17 +0000 (20:57 -0600)
src/mesa/shader/slang/slang_codegen.c

index 036196a8d2b4c50b28b10804cffe0848808f7bc0..94497cd833ec62e33f2808b9b9fd92ea6a6e53a6 100644 (file)
@@ -2889,6 +2889,10 @@ _slang_assignment_compatible(slang_assemble_ctx *A,
        t0.spec._struct->a_name != t1.spec._struct->a_name)
       return GL_FALSE;
 
+   if (t0.spec.type == SLANG_SPEC_FLOAT &&
+       t1.spec.type == SLANG_SPEC_BOOL)
+      return GL_FALSE;
+
 #if 0 /* not used just yet - causes problems elsewhere */
    if (t0.spec.type == SLANG_SPEC_INT &&
        t1.spec.type == SLANG_SPEC_FLOAT)
@@ -3237,6 +3241,18 @@ _slang_gen_compare(slang_assemble_ctx *A, slang_operation *oper,
       return NULL;
    }
 
+   if (oper->type != SLANG_OPER_EQUAL &&
+       oper->type != SLANG_OPER_NOTEQUAL) {
+      /* <, <=, >, >= can only be used with scalars */
+      if ((t0.spec.type != SLANG_SPEC_INT &&
+           t0.spec.type != SLANG_SPEC_FLOAT) ||
+          (t1.spec.type != SLANG_SPEC_INT &&
+           t1.spec.type != SLANG_SPEC_FLOAT)) {
+         slang_info_log_error(A->log, "Illegal type(s) for inequality operator");
+         return NULL;
+      }
+   }
+
    n =  new_node2(opcode,
                   _slang_gen_operation(A, &oper->children[0]),
                   _slang_gen_operation(A, &oper->children[1]));