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 548eae05997..b917dece9bd 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 @@ -31,6 +31,7 @@ import org.eclipse.cdt.core.dom.ast.IASTForStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTIfStatement; +import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; @@ -150,6 +151,10 @@ public class ReturnChecker extends AbstractAstFunctionChecker { IASTStatement[] statements = ((IASTCompoundStatement) body).getStatements(); if (statements.length > 0) { IASTStatement last = statements[statements.length - 1]; + // get nested statement if this is a label + while (last instanceof IASTLabelStatement) { + last = ((IASTLabelStatement) last).getNestedStatement(); + } // now check if last statement if complex (for optimization reasons, building CFG is expensive) if (isCompoundStatement(last)) { if (endsWithNoExitNode(func)) 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 9169ac64a96..b69f416b1dd 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 @@ -255,4 +255,19 @@ public class ReturnCheckerTest extends CheckerTestCase { loadCodeAndRunCpp(getAboveComment()); checkErrorLine(1); } + + // int + // fp_goto(int a) + // { + // if (a) { + // goto end; + // } + // end: + // return (a); + // } + public void testGoto_Bug346559() { + loadCodeAndRun(getAboveComment()); + checkNoErrors(); + } + } \ No newline at end of file