diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2017-10-04 10:16:31 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2017-10-04 13:45:39 +0200 |
commit | 7f0bf6220bd69cf119878ebd1352b55a042b88ed (patch) | |
tree | 30590d14fbe352ddedb20ce3c916657939a64ebd /compilerplugins/clang/dllprivate.cxx | |
parent | aed1870375cd2b718fcc5fe19cdc27b711747d9c (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.cxx | 79 |
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: */ |