summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel <noel.grandin@collabora.co.uk>2021-03-06 20:40:58 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2021-03-07 13:22:28 +0100
commite4e80ed313882f9ea1b309054e5aa3e839586516 (patch)
tree0d7e44c4456933d7e946a28c8f8d780372a4334f /compilerplugins
parent4c86b07f80740d609f1a1b04b9f53b19782be036 (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.cxx26
-rw-r--r--compilerplugins/clang/test/staticdynamic.cxx10
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: */