Implement structures and arrays in ir_dereference::is_lvalue
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 21 Apr 2010 18:54:02 +0000 (11:54 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 29 Apr 2010 01:22:54 +0000 (18:22 -0700)
ir.cpp

diff --git a/ir.cpp b/ir.cpp
index 7ada145d53b6e600c39002bcc9618c8646e608c8..6778997ac837fe43f617c96bfc37c465c399df2f 100644 (file)
--- a/ir.cpp
+++ b/ir.cpp
@@ -260,22 +260,21 @@ ir_dereference::is_lvalue()
    if (var == NULL)
       return false;
 
+   ir_variable *const as_var = var->as_variable();
    if (mode == ir_reference_variable) {
-      ir_variable *const as_var = var->as_variable();
       if (as_var == NULL)
         return false;
 
       if (as_var->type->is_array() && !as_var->array_lvalue)
         return false;
+   }
 
+   if (as_var != NULL)
       return !as_var->read_only;
-   } else if (mode == ir_reference_array) {
-      /* FINISHME: Walk up the dereference chain and figure out if
-       * FINISHME: the variable is read-only.
-       */
-   }
 
-   return true;
+   /* Walk up the dereference chain and figure out if the variable is read-only.
+    */
+   return this->var->as_rvalue()->is_lvalue();
 }
 
 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,