[cfe-commits] r131178 - in /cfe/trunk: lib/Analysis/CFG.cpp lib/Sema/AnalysisBasedWarnings.cpp test/SemaCXX/attr-noreturn.cpp
Ted Kremenek
kremenek at apple.com
Wed May 11 08:50:55 PDT 2011
Thanks John!
On May 11, 2011, at 12:19 AM, John McCall wrote:
> Author: rjmccall
> Date: Wed May 11 02:19:11 2011
> New Revision: 131178
>
> URL: http://llvm.org/viewvc/llvm-project?rev=131178&view=rev
> Log:
> Teach CFG building how to deal with CXXMemberCallExprs and BoundMemberTy,
> then teach -Wreturn-type to handle the same. Net effect: we now correctly
> handle noreturn attributes on member calls in the CFG.
>
>
> Modified:
> cfe/trunk/lib/Analysis/CFG.cpp
> cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
> cfe/trunk/test/SemaCXX/attr-noreturn.cpp
>
> Modified: cfe/trunk/lib/Analysis/CFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=131178&r1=131177&r2=131178&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/CFG.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFG.cpp Wed May 11 02:19:11 2011
> @@ -320,7 +320,6 @@
> AddStmtChoice asc);
> CFGBlock *VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *C,
> AddStmtChoice asc);
> - CFGBlock *VisitCXXMemberCallExpr(CXXMemberCallExpr *C, AddStmtChoice asc);
> CFGBlock *VisitCallExpr(CallExpr *C, AddStmtChoice asc);
> CFGBlock *VisitCaseStmt(CaseStmt *C);
> CFGBlock *VisitChooseExpr(ChooseExpr *C, AddStmtChoice asc);
> @@ -868,6 +867,7 @@
>
> case Stmt::CallExprClass:
> case Stmt::CXXOperatorCallExprClass:
> + case Stmt::CXXMemberCallExprClass:
> return VisitCallExpr(cast<CallExpr>(S), asc);
>
> case Stmt::CaseStmtClass:
> @@ -903,9 +903,6 @@
> case Stmt::CXXTemporaryObjectExprClass:
> return VisitCXXTemporaryObjectExpr(cast<CXXTemporaryObjectExpr>(S), asc);
>
> - case Stmt::CXXMemberCallExprClass:
> - return VisitCXXMemberCallExpr(cast<CXXMemberCallExpr>(S), asc);
> -
> case Stmt::CXXThrowExprClass:
> return VisitCXXThrowExpr(cast<CXXThrowExpr>(S));
>
> @@ -1153,12 +1150,19 @@
> }
>
> CFGBlock *CFGBuilder::VisitCallExpr(CallExpr *C, AddStmtChoice asc) {
> - // If this is a call to a no-return function, this stops the block here.
> - bool NoReturn = false;
> - if (getFunctionExtInfo(*C->getCallee()->getType()).getNoReturn()) {
> - NoReturn = true;
> + // Compute the callee type.
> + QualType calleeType = C->getCallee()->getType();
> + if (calleeType == Context->BoundMemberTy) {
> + QualType boundType = Expr::findBoundMemberType(C->getCallee());
> +
> + // We should only get a null bound type if processing a dependent
> + // CFG. Recover by assuming nothing.
> + if (!boundType.isNull()) calleeType = boundType;
> }
>
> + // If this is a call to a no-return function, this stops the block here.
> + bool NoReturn = getFunctionExtInfo(*calleeType).getNoReturn();
> +
> bool AddEHEdge = false;
>
> // Languages without exceptions are assumed to not throw.
> @@ -2691,13 +2695,6 @@
> return VisitChildren(C);
> }
>
> -CFGBlock *CFGBuilder::VisitCXXMemberCallExpr(CXXMemberCallExpr *C,
> - AddStmtChoice asc) {
> - autoCreateBlock();
> - appendStmt(Block, C);
> - return VisitChildren(C);
> -}
> -
> CFGBlock *CFGBuilder::VisitImplicitCastExpr(ImplicitCastExpr *E,
> AddStmtChoice asc) {
> if (asc.alwaysAdd(*this, E)) {
>
> Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=131178&r1=131177&r2=131178&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original)
> +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Wed May 11 02:19:11 2011
> @@ -196,7 +196,12 @@
> continue;
> }
> Expr *CEE = C->getCallee()->IgnoreParenCasts();
> - if (getFunctionExtInfo(CEE->getType()).getNoReturn()) {
> + QualType calleeType = CEE->getType();
> + if (calleeType == AC.getASTContext().BoundMemberTy) {
> + calleeType = Expr::findBoundMemberType(CEE);
> + assert(!calleeType.isNull() && "analyzing unresolved call?");
> + }
> + if (getFunctionExtInfo(calleeType).getNoReturn()) {
> NoReturnEdge = true;
> HasFakeEdge = true;
> } else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) {
>
> Modified: cfe/trunk/test/SemaCXX/attr-noreturn.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-noreturn.cpp?rev=131178&r1=131177&r2=131178&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/attr-noreturn.cpp (original)
> +++ cfe/trunk/test/SemaCXX/attr-noreturn.cpp Wed May 11 02:19:11 2011
> @@ -1,5 +1,22 @@
> // RUN: %clang_cc1 -fsyntax-only -verify %s
>
> +// Reachability tests have to come first because they get suppressed
> +// if any errors have occurred.
> +namespace test5 {
> + struct A {
> + __attribute__((noreturn)) void fail();
> + void nofail();
> + } a;
> +
> + int &test1() {
> + a.nofail();
> + } // expected-warning {{control reaches end of non-void function}}
> +
> + int &test2() {
> + a.fail();
> + }
> +}
> +
> // PR5620
> void f0() __attribute__((__noreturn__));
> void f1(void (*)());
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list