diff options
author | Noel Grandin <noel@peralex.com> | 2016-02-17 13:14:50 +0200 |
---|---|---|
committer | Noel Grandin <noel@peralex.com> | 2016-02-23 08:08:56 +0200 |
commit | c45d3badc96481db093560b94d8bf51ead6bd17c (patch) | |
tree | 4bb6c9220678a12b327e46ca2acd01e77fc8e2c4 /compilerplugins | |
parent | 003d0ccf902d2449320dd24119564565a384f365 (diff) |
new loplugin: commaoperator
Change-Id: I03f24e61f696b7619855e3c7010aa0d874e5a4ff
Diffstat (limited to 'compilerplugins')
-rw-r--r-- | compilerplugins/clang/commaoperator.cxx | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/compilerplugins/clang/commaoperator.cxx b/compilerplugins/clang/commaoperator.cxx new file mode 100644 index 000000000000..4df9cea9b435 --- /dev/null +++ b/compilerplugins/clang/commaoperator.cxx @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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 <cassert> +#include <string> +#include <iostream> +#include <fstream> +#include <set> +#include "plugin.hxx" +#include "compat.hxx" + +/** +the comma operator is best used sparingly +*/ + +namespace { + +class CommaOperator: + public RecursiveASTVisitor<CommaOperator>, public loplugin::Plugin +{ +public: + explicit CommaOperator(InstantiationData const & data): Plugin(data) {} + + virtual void run() override + { + TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); + } + + bool VisitBinaryOperator(const BinaryOperator* ); +}; + +bool CommaOperator::VisitBinaryOperator(const BinaryOperator* binaryOp) +{ + if (ignoreLocation(binaryOp)) { + return true; + } + if (binaryOp->getOpcode() != BO_Comma) { + return true; + } + const Stmt* parent = parentStmt(binaryOp); + if (isa<ParenExpr>(parent)) { + return true; + } + if (isa<BinaryOperator>(parent)) { + return true; + } + if (isa<ForStmt>(parent)) { + return true; + } + if (isa<ExprWithCleanups>(parent)) { + const Stmt* parent2 = parentStmt(parent); + if (isa<ForStmt>(parent2)) { + return true; + } + } +// parent->dump(); + report( + DiagnosticsEngine::Warning, "comma operator hides code", + binaryOp->getSourceRange().getBegin()) + << binaryOp->getSourceRange(); + return true; +} + + +loplugin::Plugin::Registration< CommaOperator > X("commaoperator", true); + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |