summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2017-09-30 19:35:09 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2017-10-03 08:41:11 +0200
commitd3971ec256450e6783920b46f672048b29719949 (patch)
treef4722d0e2bc321cf71b49b7573cf38640e9b28fc /compilerplugins
parentf50bf3c5225b49b3c6f77f882e35305e5dc5ccd3 (diff)
new loplugin:blockblock
Change-Id: I7b68b70fa4c7234e8882f7627026959a596968fd Reviewed-on: https://gerrit.libreoffice.org/43025 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/blockblock.cxx71
-rw-r--r--compilerplugins/clang/test/blockblock.cxx18
2 files changed, 89 insertions, 0 deletions
diff --git a/compilerplugins/clang/blockblock.cxx b/compilerplugins/clang/blockblock.cxx
new file mode 100644
index 000000000000..43e9b94deedb
--- /dev/null
+++ b/compilerplugins/clang/blockblock.cxx
@@ -0,0 +1,71 @@
+/* -*- 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"
+
+/**
+ Check for places where we declare a block directly inside a block
+ */
+namespace {
+
+class BlockBlock:
+ public RecursiveASTVisitor<BlockBlock>, public loplugin::RewritePlugin
+{
+public:
+ explicit BlockBlock(InstantiationData const & data): RewritePlugin(data) {}
+
+ virtual void run() override
+ {
+ StringRef fn( compiler.getSourceManager().getFileEntryForID(
+ compiler.getSourceManager().getMainFileID())->getName() );
+ if (loplugin::hasPathnamePrefix(fn, SRCDIR "/sal/osl/unx/file_misc.cxx"))
+ return;
+
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+ }
+
+ bool VisitCompoundStmt(CompoundStmt const * );
+};
+
+bool BlockBlock::VisitCompoundStmt(CompoundStmt const * compound)
+{
+ if (ignoreLocation(compound))
+ return true;
+ if (compound->size() != 1)
+ return true;
+ auto inner = *compound->body_begin();
+ if (!isa<CompoundStmt>(inner))
+ return true;
+ if (compiler.getSourceManager().isMacroBodyExpansion(compound->getLocStart()))
+ return true;
+ if (compiler.getSourceManager().isMacroBodyExpansion(inner->getLocStart()))
+ return true;
+ report(
+ DiagnosticsEngine::Warning,
+ "block directly inside block",
+ compound->getLocStart())
+ << compound->getSourceRange();
+ report(
+ DiagnosticsEngine::Note,
+ "inner block here",
+ inner->getLocStart())
+ << inner->getSourceRange();
+ return true;
+}
+
+loplugin::Plugin::Registration< BlockBlock > X("blockblock", true);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/compilerplugins/clang/test/blockblock.cxx b/compilerplugins/clang/test/blockblock.cxx
new file mode 100644
index 000000000000..d81f9fe527ae
--- /dev/null
+++ b/compilerplugins/clang/test/blockblock.cxx
@@ -0,0 +1,18 @@
+/* -*- 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/.
+ */
+
+
+int main() { // expected-error {{block directly inside block [loplugin:blockblock]}}
+ { // expected-note {{inner block here [loplugin:blockblock]}}
+ int x = 1;
+ (void)x;
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */