diff options
author | Noel <noel.grandin@collabora.co.uk> | 2021-03-06 20:40:58 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-03-07 13:22:28 +0100 |
commit | e4e80ed313882f9ea1b309054e5aa3e839586516 (patch) | |
tree | 0d7e44c4456933d7e946a28c8f8d780372a4334f /compilerplugins | |
parent | 4c86b07f80740d609f1a1b04b9f53b19782be036 (diff) |
loplugin:staticdynamic now with extra salt
because it wasn't quite there yet - now checks for casts with and
without const, because const doesn't really matter here.
Change-Id: I319025b2095a803fcaad2a7a696d2730b7fd2f81
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112098
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins')
-rw-r--r-- | compilerplugins/clang/staticdynamic.cxx | 26 | ||||
-rw-r--r-- | compilerplugins/clang/test/staticdynamic.cxx | 10 |
2 files changed, 27 insertions, 9 deletions
diff --git a/compilerplugins/clang/staticdynamic.cxx b/compilerplugins/clang/staticdynamic.cxx index b104b0333fcd..7f3d2bd49aed 100644 --- a/compilerplugins/clang/staticdynamic.cxx +++ b/compilerplugins/clang/staticdynamic.cxx @@ -80,6 +80,18 @@ bool StaticDynamic::TraverseCompoundStmt(CompoundStmt* compoundStmt) return ret; } +const clang::Type* strip(QualType qt) +{ + const clang::Type* varType = qt->getUnqualifiedDesugaredType(); + if (varType->isPointerType()) + varType = varType->getPointeeType()->getUnqualifiedDesugaredType(); + if (varType->isReferenceType()) + varType = varType->getAs<clang::ReferenceType>() + ->getPointeeType() + ->getUnqualifiedDesugaredType(); + return varType; +} + bool StaticDynamic::VisitCXXStaticCastExpr(CXXStaticCastExpr const* staticCastExpr) { if (ignoreLocation(staticCastExpr)) @@ -90,8 +102,8 @@ bool StaticDynamic::VisitCXXStaticCastExpr(CXXStaticCastExpr const* staticCastEx auto varDecl = dyn_cast_or_null<VarDecl>(subExprDecl->getDecl()); if (!varDecl) return true; - auto it = blockState.dynamicCastVars.find( - { varDecl, staticCastExpr->getTypeAsWritten().getTypePtr() }); + auto varType = strip(staticCastExpr->getType()); + auto it = blockState.dynamicCastVars.find({ varDecl, varType }); if (it != blockState.dynamicCastVars.end()) { StringRef fn = getFilenameOfLocation( @@ -110,8 +122,7 @@ bool StaticDynamic::VisitCXXStaticCastExpr(CXXStaticCastExpr const* staticCastEx report(DiagnosticsEngine::Note, "dynamic_cast here", it->second); return true; } - blockState.staticCastVars.insert({ { varDecl, staticCastExpr->getTypeAsWritten().getTypePtr() }, - compat::getBeginLoc(staticCastExpr) }); + blockState.staticCastVars.insert({ { varDecl, varType }, compat::getBeginLoc(staticCastExpr) }); return true; } @@ -126,8 +137,8 @@ bool StaticDynamic::VisitCXXDynamicCastExpr(CXXDynamicCastExpr const* dynamicCas auto varDecl = dyn_cast_or_null<VarDecl>(subExprDecl->getDecl()); if (!varDecl) return true; - auto it = blockState.staticCastVars.find( - { varDecl, dynamicCastExpr->getTypeAsWritten().getTypePtr() }); + auto varType = strip(dynamicCastExpr->getTypeAsWritten()); + auto it = blockState.staticCastVars.find({ varDecl, varType }); if (it != blockState.staticCastVars.end()) { report(DiagnosticsEngine::Warning, "dynamic_cast after static_cast", @@ -145,8 +156,7 @@ bool StaticDynamic::VisitCXXDynamicCastExpr(CXXDynamicCastExpr const* dynamicCas return true; } blockState.dynamicCastVars.insert( - { { varDecl, dynamicCastExpr->getTypeAsWritten().getTypePtr() }, - compat::getBeginLoc(dynamicCastExpr) }); + { { varDecl, varType }, compat::getBeginLoc(dynamicCastExpr) }); return true; } diff --git a/compilerplugins/clang/test/staticdynamic.cxx b/compilerplugins/clang/test/staticdynamic.cxx index d700ea06c435..aa6ca7559b6b 100644 --- a/compilerplugins/clang/test/staticdynamic.cxx +++ b/compilerplugins/clang/test/staticdynamic.cxx @@ -14,7 +14,7 @@ struct ClassA struct ClassB : public ClassA { - void foo() {} + void foo() const {} }; void f1(ClassA* p1) @@ -33,4 +33,12 @@ void f2(ClassA* p1) static_cast<ClassB*>(p1)->foo(); }; +void f3(ClassA* p1) +{ + // expected-note@+1 {{dynamic_cast here [loplugin:staticdynamic]}} + dynamic_cast<const ClassB*>(p1)->foo(); + // expected-error@+1 {{static_cast after dynamic_cast [loplugin:staticdynamic]}} + static_cast<ClassB*>(p1)->foo(); +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |