mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 15:38:09 +02:00
ir_constant: Don't assert on out-of-bounds array accesses
Several optimization paths, including constant folding, can lead to accessing an ir_constant array with an out of bounds index. The GLSL spec lets us produce "undefined" results, but it does not let us crash. Fixes piglit test case glsl-array-bounds-01 and glsl-array-bounds-03.
This commit is contained in:
parent
1b708d8f4d
commit
664364052f
1 changed files with 15 additions and 1 deletions
|
|
@ -519,7 +519,21 @@ ir_constant *
|
|||
ir_constant::get_array_element(unsigned i) const
|
||||
{
|
||||
assert(this->type->is_array());
|
||||
assert(i < this->type->length);
|
||||
|
||||
/* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
|
||||
*
|
||||
* "Behavior is undefined if a shader subscripts an array with an index
|
||||
* less than 0 or greater than or equal to the size the array was
|
||||
* declared with."
|
||||
*
|
||||
* Most out-of-bounds accesses are removed before things could get this far.
|
||||
* There are cases where non-constant array index values can get constant
|
||||
* folded.
|
||||
*/
|
||||
if (int(i) < 0)
|
||||
i = 0;
|
||||
else if (i >= this->type->length)
|
||||
i = this->type->length - 1;
|
||||
|
||||
return array_elements[i];
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue