Files
libreoffice/compilerplugins/clang/unicodetochar.cxx
Stephan Bergmann 948c9c0a31 Use unique class names for better FlameGraph results
...of measuring loplugin performance, when gathering data with perf and all
plugins that used "Visitor" as class name were lumped together.  (Cf.
<https://whatofhow.wordpress.com/2016/06/28/plugin-flamed/>.)

Change-Id: Ie482f443faced7469528da4772e735bc2eda596d
Reviewed-on: https://gerrit.libreoffice.org/43324
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Tested-by: Stephan Bergmann <sbergman@redhat.com>
2017-10-11 14:26:44 +02:00

89 lines
2.7 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <stack>
#include "check.hxx"
#include "plugin.hxx"
// In C++, find implicit conversions from char16_t (aka sal_Unicode) to char.
// Such places are probably meant to properly work on char16_t instead.
namespace {
class UnicodeToChar final:
public RecursiveASTVisitor<UnicodeToChar>, public loplugin::Plugin
{
public:
explicit UnicodeToChar(InstantiationData const & data): Plugin(data) {}
bool TraverseCStyleCastExpr(CStyleCastExpr * expr) {
subExprs_.push(expr->getSubExpr());
bool ret = RecursiveASTVisitor::TraverseCStyleCastExpr(expr);
subExprs_.pop();
return ret;
}
bool TraverseCXXStaticCastExpr(CXXStaticCastExpr * expr) {
subExprs_.push(expr->getSubExpr());
bool ret = RecursiveASTVisitor::TraverseCXXStaticCastExpr(expr);
subExprs_.pop();
return ret;
}
bool TraverseCXXFunctionalCastExpr(CXXFunctionalCastExpr * expr) {
subExprs_.push(expr->getSubExpr());
bool ret = RecursiveASTVisitor::TraverseCXXFunctionalCastExpr(expr);
subExprs_.pop();
return ret;
}
bool VisitImplicitCastExpr(ImplicitCastExpr const * expr) {
if ((!subExprs_.empty() && expr == subExprs_.top())
|| ignoreLocation(expr))
{
return true;
}
if (!(loplugin::TypeCheck(expr->getType()).Char()
&& expr->getSubExpr()->getType()->isSpecificBuiltinType(
clang::BuiltinType::Char16)))
{
return true;
}
APSInt res;
if (expr->getSubExpr()->EvaluateAsInt(res, compiler.getASTContext())
&& res >= 0 && res <= 0x7F)
{
return true;
}
report(
DiagnosticsEngine::Warning,
"suspicious implicit cast from %0 to %1",
expr->getExprLoc())
<< expr->getSubExpr()->getType() << expr->getType()
<< expr->getSourceRange();
return true;
}
private:
void run() override {
if (compiler.getLangOpts().CPlusPlus) {
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
}
}
std::stack<Expr const *> subExprs_;
};
static loplugin::Plugin::Registration<UnicodeToChar> reg("unicodetochar");
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */