From b8b9084ce272fddef85a52d50cc26fcebb598223 Mon Sep 17 00:00:00 2001 From: Alena Laskavaia Date: Mon, 25 Apr 2011 01:45:28 +0000 Subject: [PATCH] Bug 332285 - Parser misinterprets return statement in lambda --- .../internal/checkers/ReturnChecker.java | 20 ++++++++--------- .../internal/checkers/ReturnCheckerTest.java | 22 +++++++++++++++---- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java index f95c474367f..0a2fb6a8448 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java @@ -24,7 +24,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; -import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; +import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; @@ -38,11 +38,11 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; -import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; /** * The checker suppose to find issue related to mismatched return value/function @@ -65,6 +65,7 @@ public class ReturnChecker extends AbstractAstFunctionChecker { ReturnStmpVisitor(IASTFunctionDefinition func) { shouldVisitStatements = true; shouldVisitDeclarations = true; + shouldVisitExpressions = true; this.func = func; this.hasret = false; } @@ -74,7 +75,12 @@ public class ReturnChecker extends AbstractAstFunctionChecker { return PROCESS_SKIP; // skip inner functions return PROCESS_CONTINUE; } - + public int visit(IASTExpression expr) { + if (expr instanceof ICPPASTLambdaExpression) { + return PROCESS_SKIP; + } + return PROCESS_CONTINUE; + } public int visit(IASTStatement stmt) { if (stmt instanceof IASTReturnStatement) { hasret = true; @@ -94,14 +100,6 @@ public class ReturnChecker extends AbstractAstFunctionChecker { } return PROCESS_SKIP; } - if (stmt instanceof IASTExpressionStatement) { - // do not process expression they may contain nasty stuff - IASTExpressionStatement stmt1 = (IASTExpressionStatement) stmt; - if (stmt1.getExpression() instanceof IGNUASTCompoundStatementExpression) { - return PROCESS_CONTINUE; - } - return PROCESS_SKIP; - } return PROCESS_CONTINUE; } diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java index 40c14495ea0..abf5e920124 100644 --- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java +++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java @@ -17,9 +17,14 @@ import org.eclipse.cdt.codan.internal.checkers.ReturnChecker; /** * Test for {@see ReturnCheckerTest} class - * + * */ public class ReturnCheckerTest extends CheckerTestCase { + @Override + public void setUp() throws Exception { + super.setUp(); + enableProblems(ReturnChecker.RET_NORET_ID,ReturnChecker.RET_ERR_VALUE_ID,ReturnChecker.RET_NO_VALUE_ID); + } // dummy() { // return; // error here on line 2 // } @@ -42,7 +47,7 @@ public class ReturnCheckerTest extends CheckerTestCase { // return; // error here on line 4 // } // } - // } + // } public void testBasicTypeFunction() { loadCodeAndRun(getAboveComment()); checkErrorLine(4); @@ -62,7 +67,7 @@ public class ReturnCheckerTest extends CheckerTestCase { } // typedef unsigned int uint8_t; - // + // // uint8_t return_typedef(void) { // return; // error here on line 4 // } @@ -72,7 +77,7 @@ public class ReturnCheckerTest extends CheckerTestCase { } // typedef unsigned int uint8_t; - // + // // uint8_t (*return_fp_no_typedef(void))(void) // { // return; // error here on line 5 @@ -146,6 +151,15 @@ public class ReturnCheckerTest extends CheckerTestCase { loadCodeAndRunCpp(getAboveComment()); checkNoErrors(); } +// void f() +// { +// if ([](int r){return r == 0;}(0)) +// ; +// } + public void testLambda2_Bug332285() { + loadCodeAndRunCpp(getAboveComment()); + checkNoErrors(); + } // void g() // {