1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

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>
This commit is contained in:
Marco Stornelli 2019-09-28 09:07:04 +02:00
parent a71a413500
commit a781cdf342
2 changed files with 39 additions and 0 deletions

View file

@ -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);
}
}

View file

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