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:
parent
a71a413500
commit
a781cdf342
2 changed files with 39 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue