Author: Aaron Puchert Date: 2020-10-25T19:37:16+01:00 New Revision: b296c64e64a0bc600538c8bc67d4ccc2564e3c72
URL: https://github.com/llvm/llvm-project/commit/b296c64e64a0bc600538c8bc67d4ccc2564e3c72 DIFF: https://github.com/llvm/llvm-project/commit/b296c64e64a0bc600538c8bc67d4ccc2564e3c72.diff LOG: Thread safety analysis: Nullability improvements in TIL, NFCI The constructor of Project asserts that the contained ValueDecl is not null, use that in the ThreadSafetyAnalyzer. In the case of LiteralPtr it's the other way around. Also dyn_cast<> is sufficient if we know something isn't null. Added: Modified: clang/include/clang/Analysis/Analyses/ThreadSafetyTIL.h clang/lib/Analysis/ThreadSafety.cpp clang/lib/Analysis/ThreadSafetyCommon.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Analysis/Analyses/ThreadSafetyTIL.h b/clang/include/clang/Analysis/Analyses/ThreadSafetyTIL.h index c26d2ed99dd2..77a800c28754 100644 --- a/clang/include/clang/Analysis/Analyses/ThreadSafetyTIL.h +++ b/clang/include/clang/Analysis/Analyses/ThreadSafetyTIL.h @@ -634,7 +634,9 @@ typename V::R_SExpr Literal::traverse(V &Vs, typename V::R_Ctx Ctx) { /// At compile time, pointer literals are represented by symbolic names. class LiteralPtr : public SExpr { public: - LiteralPtr(const ValueDecl *D) : SExpr(COP_LiteralPtr), Cvdecl(D) {} + LiteralPtr(const ValueDecl *D) : SExpr(COP_LiteralPtr), Cvdecl(D) { + assert(D && "ValueDecl must not be null"); + } LiteralPtr(const LiteralPtr &) = default; static bool classof(const SExpr *E) { return E->opcode() == COP_LiteralPtr; } diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index ef90fa175a6d..65d410a65ba4 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -1279,9 +1279,8 @@ bool ThreadSafetyAnalyzer::inCurrentScope(const CapabilityExpr &CapE) { if (const auto *P = dyn_cast<til::Project>(SExp)) { if (!CurrentMethod) return false; - const auto *VD = P->clangDecl(); - if (VD) - return VD->getDeclContext() == CurrentMethod->getDeclContext(); + const ValueDecl *VD = P->clangDecl(); + return VD->getDeclContext() == CurrentMethod->getDeclContext(); } return false; diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp index 1b8c55e56d47..0c5d1857cc2b 100644 --- a/clang/lib/Analysis/ThreadSafetyCommon.cpp +++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp @@ -185,7 +185,7 @@ CapabilityExpr SExprBuilder::translateAttrExpr(const Expr *AttrExp, return CapabilityExpr(nullptr, false); // Hack to deal with smart pointers -- strip off top-level pointer casts. - if (const auto *CE = dyn_cast_or_null<til::Cast>(E)) { + if (const auto *CE = dyn_cast<til::Cast>(E)) { if (CE->castOpcode() == til::CAST_objToPtr) return CapabilityExpr(CE->expr(), Neg); } @@ -274,7 +274,7 @@ til::SExpr *SExprBuilder::translateDeclRefExpr(const DeclRefExpr *DRE, const auto *VD = cast<ValueDecl>(DRE->getDecl()->getCanonicalDecl()); // Function parameters require substitution and/or renaming. - if (const auto *PV = dyn_cast_or_null<ParmVarDecl>(VD)) { + if (const auto *PV = dyn_cast<ParmVarDecl>(VD)) { unsigned I = PV->getFunctionScopeIndex(); const DeclContext *D = PV->getDeclContext(); if (Ctx && Ctx->FunArgs) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits