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) {