Bug 343274 - Fix VariableReadWriteFlags errors

Read and write flags weren't correctly set for array access.

Change-Id: I2c54b270895514f3681903709498aa9344a5bc7e
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java
index 2f024e8..5eb63ee 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java
@@ -229,4 +229,20 @@
 		a.assertReadWriteFlags("variadic(waldo)", "waldo", READ);
 		a.assertReadWriteFlags("variadic(&waldo)", "waldo", READ | WRITE);
 	}
+
+	//	int arr[5];
+	//	int test() {
+	//		arr[0];
+	//		arr[0] = 1;
+	//		int a;
+	//		a = arr[0];
+	//		return arr[0];
+	//	}
+	public void testArraySubscript() throws Exception {
+		AssertionHelper a = getCPPAssertionHelper();
+		a.assertReadWriteFlags("arr[0];", "arr", READ);
+		a.assertReadWriteFlags("arr[0] = 1", "arr", READ | WRITE);
+		a.assertReadWriteFlags("a = arr[0];", "arr", READ);
+		a.assertReadWriteFlags("return arr[0];", "arr", READ);
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java
index fb757d8..a7bc98a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java
@@ -132,6 +132,24 @@
 		}
 	}
 
+	private boolean isAssignment(IASTBinaryExpression node) {
+		switch (node.getOperator()) {
+		case IASTBinaryExpression.op_assign:
+		case IASTBinaryExpression.op_binaryAndAssign:
+		case IASTBinaryExpression.op_binaryOrAssign:
+		case IASTBinaryExpression.op_binaryXorAssign:
+		case IASTBinaryExpression.op_divideAssign:
+		case IASTBinaryExpression.op_minusAssign:
+		case IASTBinaryExpression.op_moduloAssign:
+		case IASTBinaryExpression.op_multiplyAssign:
+		case IASTBinaryExpression.op_plusAssign:
+		case IASTBinaryExpression.op_shiftLeftAssign:
+		case IASTBinaryExpression.op_shiftRightAssign:
+			return true;
+		}
+		return false;
+	}
+
 	protected int rwInExpression(IASTExpression expr, IASTNode node, int indirection) {
 		if (expr instanceof IASTIdExpression) {
 			return rwAnyNode(expr, indirection);
@@ -152,6 +170,11 @@
 			if (indirection > 0 && node.getPropertyInParent() == IASTArraySubscriptExpression.ARRAY) {
 				return rwAnyNode(expr, indirection - 1);
 			}
+			if (expr.getParent() instanceof IASTBinaryExpression
+					&& expr.getPropertyInParent() == IASTBinaryExpression.OPERAND_ONE
+					&& isAssignment((IASTBinaryExpression) expr.getParent())) {
+				return READ | WRITE;
+			}
 			return READ;
 		}
 		if (expr instanceof IASTConditionalExpression) {