summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/dllprivate.cxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-10-04 10:16:31 +0200
committerStephan Bergmann <sbergman@redhat.com>2017-10-04 13:45:39 +0200
commit7f0bf6220bd69cf119878ebd1352b55a042b88ed (patch)
tree30590d14fbe352ddedb20ce3c916657939a64ebd /compilerplugins/clang/dllprivate.cxx
parentaed1870375cd2b718fcc5fe19cdc27b711747d9c (diff)
Revert "check for unnecessary DLLPUBLIC annotations"
This reverts commit a599eeab786ecbe1b5b6509e3c792e5c1ba31248, plus follow-up fa4431449d0306e8179f53a2a69c549800bd24bd "Avoid bogus loplugin:dllmacro 'unnecessary *DLLPUBLIC declaration ...'". See (abandoned) <https://gerrit.libreoffice.org/#/c/42983/> "loplugin:dllmacro: Handle implicit member functions" how this would have needed to be extended to give consistent results across Linux and macOS, but then would have started to remove DLLPUBLIC from entities that apparently need to at least have default type visibility on macOS and started to make tests fail.
Diffstat (limited to 'compilerplugins/clang/dllprivate.cxx')
-rw-r--r--compilerplugins/clang/dllprivate.cxx79
1 files changed, 79 insertions, 0 deletions
diff --git a/compilerplugins/clang/dllprivate.cxx b/compilerplugins/clang/dllprivate.cxx
new file mode 100644
index 000000000000..05cf26d7d5d2
--- /dev/null
+++ b/compilerplugins/clang/dllprivate.cxx
@@ -0,0 +1,79 @@
+/* -*- 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 "plugin.hxx"
+
+namespace {
+
+class Visitor final:
+ public RecursiveASTVisitor<Visitor>, public loplugin::Plugin
+{
+public:
+ explicit Visitor(InstantiationData const & data): Plugin(data) {}
+
+ bool VisitNamedDecl(NamedDecl const * decl) {
+ if (!decl->getLocation().isInvalid()&&ignoreLocation(decl)) {
+ return true;
+ }
+ auto a = decl->getAttr<VisibilityAttr>();
+ if (a == nullptr || a->getVisibility() != VisibilityAttr::Hidden) {
+ return true;
+ }
+ if (compiler.getSourceManager().isMacroBodyExpansion(
+ decl->getLocation())
+ && (Lexer::getImmediateMacroName(
+ decl->getLocation(), compiler.getSourceManager(),
+ compiler.getLangOpts())
+ == "Q_OBJECT")) // from /usr/include/QtCore/qobjectdefs.h
+ {
+ return true;
+ }
+ auto p = dyn_cast<RecordDecl>(decl->getDeclContext());
+ if (p == nullptr) {
+ report(
+ DiagnosticsEngine::Warning,
+ "top-level declaration redundantly marked as DLLPRIVATE",
+ a->getLocation())
+ << decl->getSourceRange();
+ } else if (p->getVisibility() == HiddenVisibility) {
+ report(
+ DiagnosticsEngine::Warning,
+ ("declaration nested in DLLPRIVATE declaration redundantly"
+ " marked as DLLPRIVATE"),
+ a->getLocation())
+ << decl->getSourceRange();
+ report(
+ DiagnosticsEngine::Note, "parent declaration is here",
+ p->getLocation())
+ << p->getSourceRange();
+ }
+ return true;
+ }
+
+private:
+ void run() override {
+ // DISABLE_DYNLOADING makes SAL_DLLPUBLIC_{EXPORT,IMPORT,TEMPLATE} expand
+ // to visibility("hidden") attributes, which would cause bogus warnings
+ // here (e.g., in UBSan builds that explicitly define DISABLE_DYNLOADING
+ // in jurt/source/pipe/staticsalhack.cxx); alternatively, change
+ // include/sal/types.h to make those SAL_DLLPUBLIC_* expand to nothing
+ // for DISABLE_DYNLOADING:
+ if (!compiler.getPreprocessor().getIdentifierInfo("DISABLE_DYNLOADING")
+ ->hasMacroDefinition())
+ {
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+ }
+ }
+};
+
+static loplugin::Plugin::Registration<Visitor> reg("dllprivate");
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */