summaryrefslogtreecommitdiff
path: root/src/glsl/ir.cpp
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-08-17 12:57:28 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-08-17 13:00:03 -0700
commit664364052f362af2789e6b0fa88b6a5ba66ba936 (patch)
tree3439eafb015486f929730450d75b02d5fa51e333 /src/glsl/ir.cpp
parent1b708d8f4dd1a853de8537e81e6d5bf8c9f2aed1 (diff)
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.
Diffstat (limited to 'src/glsl/ir.cpp')
-rw-r--r--src/glsl/ir.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index dd059e470d..ebb592792b 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -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];
}