[Libreoffice-commits] core.git: compilerplugins/clang vcl/workben
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Mon Nov 19 08:25:59 UTC 2018
compilerplugins/clang/redundantcast.cxx | 46 +++++++++++++++++++++++++++
compilerplugins/clang/test/redundantcast.cxx | 7 ++++
vcl/workben/vcldemo.cxx | 4 +-
3 files changed, 55 insertions(+), 2 deletions(-)
New commits:
commit 50e644253f78ab002f180fb8e82ca181b95cb7ff
Author: Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Mon Nov 19 08:16:12 2018 +0100
Commit: Stephan Bergmann <sbergman at redhat.com>
CommitDate: Mon Nov 19 09:25:35 2018 +0100
Take array-to-pointer decay into account in loplugin:redundantcast
Change-Id: I3c5bace180605d1a72a74feb1bf9f9b184a16d83
Reviewed-on: https://gerrit.libreoffice.org/63545
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/compilerplugins/clang/redundantcast.cxx b/compilerplugins/clang/redundantcast.cxx
index d390a7e15ccc..3d9ff97b473b 100644
--- a/compilerplugins/clang/redundantcast.cxx
+++ b/compilerplugins/clang/redundantcast.cxx
@@ -358,6 +358,28 @@ bool RedundantCast::VisitCXXStaticCastExpr(CXXStaticCastExpr const * expr) {
<< expr->getSourceRange();
return true;
}
+ if (auto const impl = dyn_cast<ImplicitCastExpr>(expr->getSubExpr())) {
+ if (impl->getCastKind() == CK_ArrayToPointerDecay && impl->getType() == t2)
+ //TODO: instead of exact QualType match, allow some variation?
+ {
+ auto const fn = handler.getMainFileName();
+ if (!(loplugin::isSamePathname(
+ fn, SRCDIR "/sal/qa/rtl/strings/test_ostring_concat.cxx")
+ || loplugin::isSamePathname(
+ fn, SRCDIR "/sal/qa/rtl/strings/test_ostring_stringliterals.cxx")
+ || loplugin::isSamePathname(
+ fn, SRCDIR "/sal/qa/rtl/strings/test_oustring_concat.cxx")
+ || loplugin::isSamePathname(
+ fn, SRCDIR "/sal/qa/rtl/strings/test_oustring_stringliterals.cxx")))
+ {
+ report(
+ DiagnosticsEngine::Warning, "redundant static_cast from %0 to %1",
+ expr->getExprLoc())
+ << expr->getSubExprAsWritten()->getType() << t2 << expr->getSourceRange();
+ }
+ return true;
+ }
+ }
auto const t3 = expr->getType();
auto const c1 = t1.getCanonicalType();
auto const c3 = t3.getCanonicalType();
@@ -471,6 +493,30 @@ bool RedundantCast::VisitCXXReinterpretCastExpr(
if (ignoreLocation(expr)) {
return true;
}
+ if (auto const sub = dyn_cast<ImplicitCastExpr>(expr->getSubExpr())) {
+ if (sub->getCastKind() == CK_ArrayToPointerDecay && sub->getType() == expr->getType())
+ //TODO: instead of exact QualType match, allow some variation?
+ {
+ if (loplugin::TypeCheck(sub->getType()).Pointer().Const().Char()) {
+ if (auto const lit = dyn_cast<clang::StringLiteral>(expr->getSubExprAsWritten())) {
+ if (lit->getKind() == clang::StringLiteral::UTF8) {
+ // Don't warn about
+ //
+ // redundant_cast<char const *>(u8"...")
+ //
+ // in pre-C++2a code:
+ return true;
+ }
+ }
+ }
+ report(
+ DiagnosticsEngine::Warning, "redundant reinterpret_cast from %0 to %1",
+ expr->getExprLoc())
+ << expr->getSubExprAsWritten()->getType() << expr->getTypeAsWritten()
+ << expr->getSourceRange();
+ return true;
+ }
+ }
if (expr->getSubExpr()->getType()->isVoidPointerType()) {
auto t = expr->getType()->getAs<clang::PointerType>();
if (t == nullptr || !t->getPointeeType()->isObjectType()) {
diff --git a/compilerplugins/clang/test/redundantcast.cxx b/compilerplugins/clang/test/redundantcast.cxx
index 3aae140d77f0..be34a57729c6 100644
--- a/compilerplugins/clang/test/redundantcast.cxx
+++ b/compilerplugins/clang/test/redundantcast.cxx
@@ -386,6 +386,12 @@ void testIntermediaryStaticCast() {
d = int(d) + 1.0; // expected-error {{suspicious functional cast from 'double' to 'int', result is implicitly cast to 'double' [loplugin:redundantcast]}}
};
+void testArrayDecay() {
+ (void) static_cast<char const *>(""); // expected-error {{redundant static_cast from 'const char [1]' to 'const char *' [loplugin:redundantcast]}}
+ (void) reinterpret_cast<char const *>(""); // expected-error {{redundant reinterpret_cast from 'const char [1]' to 'const char *' [loplugin:redundantcast]}}
+ (void) reinterpret_cast<char const *>(u8"");
+}
+
int main() {
testConstCast();
testStaticCast();
@@ -395,6 +401,7 @@ int main() {
testReinterpretConstCast();
testDynamicCast();
testIntermediaryStaticCast();
+ testArrayDecay();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 59d121b70c28..eab50a288175 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -523,8 +523,8 @@ public:
const char *mpString;
} const aRuns[] = {
#define SET(font,string) { font, reinterpret_cast<const char *>(string) }
- SET("sans", "a"), // logical font - no 'sans' font.
- SET("opensymbol", "#$%"), // font fallback - $ is missing.
+ {"sans", "a"}, // logical font - no 'sans' font.
+ {"opensymbol", "#$%"}, // font fallback - $ is missing.
SET("sans", pInvalid), // unicode invalid character
// tdf#96266 - stacking diacritics
SET("carlito", pDiacritic1),
More information about the Libreoffice-commits
mailing list