glsl: Don't use base type for bit-not when there's an error
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 24 Dec 2011 01:16:43 +0000 (17:16 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 4 Jan 2012 20:43:10 +0000 (12:43 -0800)
Other parts of the compiler assume that expressions will have
well-formed types or the error type.  Just using the type of the thing
being operated on can cause expressions like ~3.14 or ~false to not
have a well-formed type.  This could then result in an assertion
failure in the context epxression handler.

If there is an error processing the expression, set the type of the IR
expression to error.

Fixes piglit's bit-not-0[789].frag tests.

NOTE: This is a candidate for the 7.11 branch.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42755
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: Vinson Lee <vlee@vmware.com>
src/glsl/ast_to_hir.cpp

index d5b04e9d7bb8d579fb721ce4bafb89c1a1e2ef2b..f0c92187507bd4041270f4b46b64efcf50da3ba2 100644 (file)
@@ -1184,7 +1184,7 @@ ast_expression::hir(exec_list *instructions,
         error_emitted = true;
       }
 
-      type = op[0]->type;
+      type = error_emitted ? glsl_type::error_type : op[0]->type;
       result = new(ctx) ir_expression(ir_unop_bit_not, type, op[0], NULL);
       break;