summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2014-05-30 14:09:40 +0200
committerStephan Bergmann <sbergman@redhat.com>2014-05-30 14:12:31 +0200
commit909a76c7da77d8ecee8d797dd1ba77a5062ac303 (patch)
tree460c6d9c6fcafbb44ac66a23574bb69568df74ab /compilerplugins
parentd2e0465d406b33139f3a97e1738020d6a7a6f6c3 (diff)
New loplugin:inlinevisible to flag inline functions marked DLLEXPORT
...which does not make sense. On Linux and Mac OS X, they potentially end up exported from multiple libs (weakly, though), while on Windows the potentially even end up not emitted at all, which could cause link errors. Change-Id: I092c9ba39e686c17b6e91581cdd4753f1c4d582f
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/inlinevisible.cxx53
1 files changed, 53 insertions, 0 deletions
diff --git a/compilerplugins/clang/inlinevisible.cxx b/compilerplugins/clang/inlinevisible.cxx
new file mode 100644
index 000000000000..a16187307b7d
--- /dev/null
+++ b/compilerplugins/clang/inlinevisible.cxx
@@ -0,0 +1,53 @@
+/* -*- 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 "clang/AST/Attr.h"
+#include "clang/Sema/SemaInternal.h" // warn_unused_function
+
+#include "compat.hxx"
+#include "plugin.hxx"
+
+namespace {
+
+class InlineVisible:
+ public RecursiveASTVisitor<InlineVisible>, public loplugin::Plugin
+{
+public:
+ explicit InlineVisible(InstantiationData const & data): Plugin(data) {}
+
+ void run() override
+ { TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); }
+
+ bool VisitFunctionDecl(FunctionDecl const * decl);
+};
+
+bool InlineVisible::VisitFunctionDecl(FunctionDecl const * decl) {
+ if (!ignoreLocation(decl) && decl->isInlineSpecified()) {
+ VisibilityAttr * attr = decl->getAttr<VisibilityAttr>();
+ if (attr != nullptr && attr->getVisibility() == VisibilityAttr::Default)
+ {
+ report(
+ DiagnosticsEngine::Warning,
+ ("Function explicitly declared both inline and "
+ " visibility=default"),
+ decl->getLocation())
+ << decl->getSourceRange();
+ }
+ }
+ return true;
+}
+
+loplugin::Plugin::Registration<InlineVisible> X("inlinevisible");
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */