From d8fa40dfa7adb062c969ce7ea6ce505e10626838 Mon Sep 17 00:00:00 2001 From: Aaron Puchert Date: Thu, 14 Jul 2022 13:39:04 +0200 Subject: Thread safety analysis: Handle additional cast in scoped capability construction We might have a CK_NoOp cast and a further CK_ConstructorConversion. As an optimization, drop some IgnoreParens calls: inside of the CK_{Constructor,UserDefined}Conversion should be no more parentheses, and inside the CXXBindTemporaryExpr should also be none. Lastly, we factor out the unpacking so that we can reuse it for MaterializeTemporaryExprs later on. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D129752 --- clang/lib/Analysis/ThreadSafety.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'clang/lib/Analysis/ThreadSafety.cpp') diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index 3291d7f..a29134c6 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -2087,6 +2087,19 @@ static Expr *buildFakeCtorCall(CXXConstructorDecl *CD, ArrayRef Args, SourceRange(Loc, Loc)); } +static Expr *UnpackConstruction(Expr *E) { + if (auto *CE = dyn_cast(E)) + if (CE->getCastKind() == CK_NoOp) + E = CE->getSubExpr()->IgnoreParens(); + if (auto *CE = dyn_cast(E)) + if (CE->getCastKind() == CK_ConstructorConversion || + CE->getCastKind() == CK_UserDefinedConversion) + E = CE->getSubExpr(); + if (auto *BTE = dyn_cast(E)) + E = BTE->getSubExpr(); + return E; +} + void BuildLockset::VisitDeclStmt(const DeclStmt *S) { // adjust the context LVarCtx = Analyzer->LocalVarMap.getNextContext(CtxIndex, S, LVarCtx); @@ -2101,13 +2114,7 @@ void BuildLockset::VisitDeclStmt(const DeclStmt *S) { // handle constructors that involve temporaries if (auto *EWC = dyn_cast(E)) E = EWC->getSubExpr()->IgnoreParens(); - if (auto *CE = dyn_cast(E)) - if (CE->getCastKind() == CK_NoOp || - CE->getCastKind() == CK_ConstructorConversion || - CE->getCastKind() == CK_UserDefinedConversion) - E = CE->getSubExpr()->IgnoreParens(); - if (auto *BTE = dyn_cast(E)) - E = BTE->getSubExpr()->IgnoreParens(); + E = UnpackConstruction(E); if (const auto *CE = dyn_cast(E)) { const auto *CtorD = dyn_cast_or_null(CE->getConstructor()); -- cgit v1.1