diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/StatementHasNoEffectChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/StatementHasNoEffectChecker.java index 9a965b2b5e4..bd9f00fc05e 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/StatementHasNoEffectChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/StatementHasNoEffectChecker.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTBinaryExpression; @@ -85,6 +86,10 @@ public class StatementHasNoEffectChecker extends AbstractIndexAstChecker { case IASTBinaryExpression.op_shiftLeftAssign: case IASTBinaryExpression.op_shiftRightAssign: return false; + case IASTBinaryExpression.op_logicalOr: + case IASTBinaryExpression.op_logicalAnd: + return hasNoEffect(binExpr.getOperand1()) + && hasNoEffect(binExpr.getOperand2()); } if (binExpr instanceof CPPASTBinaryExpression) { // unfortunately ICPPASTBinaryExpression does not have @@ -95,9 +100,8 @@ public class StatementHasNoEffectChecker extends AbstractIndexAstChecker { return false; IType expressionType = binExpr.getOperand1() .getExpressionType(); - if (!(expressionType instanceof IBasicType)) { - return false; // must be overloaded but parser could not - // find it + if (!(expressionType instanceof IBasicType || expressionType instanceof ICPPBasicType)) { + return false; // must be overloaded but parser could not find it } } return true; diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/StatementHasNoEffectCheckerTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/StatementHasNoEffectCheckerTest.java index 364d4a1a494..b5e9806d2bb 100644 --- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/StatementHasNoEffectCheckerTest.java +++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/StatementHasNoEffectCheckerTest.java @@ -113,11 +113,14 @@ public class StatementHasNoEffectCheckerTest extends CheckerTestCase { loadCodeAndRun(getAboveComment()); checkNoErrors(); } - // main() { - // a = foo(1) || a = foo(2); + // void main() { + // bool a; + // class c {}; + // c z; + // (a = z.foo(1)) || (a = z.foo(2)); // } public void testLazyEvalHack() { - loadCodeAndRun(getAboveComment()); + loadCodeAndRunCpp(getAboveComment()); checkNoErrors(); } }