glsl: Fix assert fails when assignment expressions are in array sizes.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 12 Nov 2016 19:27:17 +0000 (11:27 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Sun, 13 Nov 2016 06:08:15 +0000 (22:08 -0800)
commit9c676a64273f32c7fb3f2b6973399af1d7f24d46
tree45b0f1920e63551e2d4c1e6512b10943bc6b27f2
parent5debfeb86f524b06aa3b80f9855947a57b5f91e8
glsl: Fix assert fails when assignment expressions are in array sizes.

Karol Herbst's fuzzing efforts discovered that we would hit the
following assert:

   assert(dummy_instructions.is_empty());

when processing an illegal array size expression of

   float[(1=1)?1:1] t;

In do_assignment, we realized we needed an rvalue for (1 = 1), and
generated a temporary variable and assignment from the RHS.  We've
already flagged an error (non-lvalue in assignment), and return a bogus
value as the rvalue.  But process_array_size sees the bogus value, which
happened to be a constant expression, and rightly assumes that
processing a constant expression shouldn't have generated any code.
instructions.

To handle this, make do_assignment not generate any temps or assignments
when it's already raised an error - just return an error value directly.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98694
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/compiler/glsl/ast_to_hir.cpp