From 77a06573a9ac854ef0e75b021f39625a7a6dc3ff Mon Sep 17 00:00:00 2001 From: Alena Laskavaia Date: Mon, 16 Apr 2012 21:56:57 -0400 Subject: [PATCH] Bug 316076 - fixed f.p. when using gcc annotation about no return --- .../cdt/codan/core/cxx/CxxAstUtils.java | 8 +++++ .../cdt/codan/core/cxx/CxxAstUtilsTest.java | 33 +++++++++++++++++++ .../internal/checkers/ReturnCheckerTest.java | 12 +++++++ 3 files changed, 53 insertions(+) diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java index 4f4dc1560f0..6bb0baf6241 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java @@ -406,6 +406,14 @@ public final class CxxAstUtils { if (!(expression instanceof IASTFunctionCallExpression)) return false; IASTExpression functionNameExpression = ((IASTFunctionCallExpression) expression).getFunctionNameExpression(); + if (functionNameExpression instanceof IASTIdExpression) { + IASTName name = ((IASTIdExpression)functionNameExpression).getName(); + + IBinding binding = name.resolveBinding(); + if (binding!=null && binding instanceof IFunction && ((IFunction)binding).isNoReturn()) { + return true; + } + } return functionNameExpression.getRawSignature().equals("exit"); //$NON-NLS-1$ } } diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtilsTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtilsTest.java index 7e4c036ca05..9d44246b2b2 100644 --- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtilsTest.java +++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtilsTest.java @@ -100,4 +100,37 @@ public class CxxAstUtilsTest extends CodanFastCxxAstTestCase { assertTrue((Boolean) result[0]); assertFalse((Boolean) result[1]); } + + //void f() __attribute__((noreturn)); + // + //int test() { + // a(); + // f(); + // exit(0); + //} + public void testExitStatement() throws IOException { + String code = getAboveComment(); + IASTTranslationUnit tu = parse(code); + final Object result[] = new Object[4]; + ASTVisitor astVisitor = new ASTVisitor() { + int i; + { + shouldVisitStatements = true; + } + + @Override + public int visit(IASTStatement stmt) { + boolean check = CxxAstUtils.isExitStatement(stmt); + result[i] = check; + i++; + return PROCESS_CONTINUE; + } + }; + tu.accept(astVisitor); + assertNotNull("Stmt not found", result[0]); //$NON-NLS-1$ + assertFalse((Boolean) result[0]); // compound body + assertFalse((Boolean) result[1]); + assertTrue((Boolean) result[2]); + assertTrue((Boolean) result[3]); + } } 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 95519bf9fb6..75584462eb4 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 @@ -298,4 +298,16 @@ public class ReturnCheckerTest extends CheckerTestCase { loadCodeAndRunCpp(getAboveComment()); checkNoErrors(); } + + +//void f() __attribute__((noreturn)); +// +//int test() { +// f(); +//} + + public void testNoReturn() { + loadCodeAndRun(getAboveComment()); + checkNoErrors(); + } } \ No newline at end of file