From a781cdf342c02cc507bd7754566eb4ce6c30cf62 Mon Sep 17 00:00:00 2001 From: Marco Stornelli Date: Sat, 28 Sep 2019 09:07:04 +0200 Subject: [PATCH] Bug 343274 - Fix VariableReadWriteFlags errors Read and write flags weren't correctly set for array access. Change-Id: I2c54b270895514f3681903709498aa9344a5bc7e Signed-off-by: Marco Stornelli --- .../ast2/VariableReadWriteFlagsTest.java | 16 +++++++++++++ .../dom/parser/VariableReadWriteFlags.java | 23 +++++++++++++++++++ 2 files changed, 39 insertions(+) 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 2f024e8cd33..5eb63ee3714 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 @@ public class VariableReadWriteFlagsTest extends AST2TestBase { 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 fb757d85f89..a7bc98a9041 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 @@ public abstract class VariableReadWriteFlags { } } + 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 @@ public abstract class VariableReadWriteFlags { 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) {