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 | |
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')
-rw-r--r-- | compilerplugins/clang/dllmacro.cxx | 112 | ||||
-rw-r--r-- | compilerplugins/clang/dllprivate.cxx | 79 |
2 files changed, 79 insertions, 112 deletions
diff --git a/compilerplugins/clang/dllmacro.cxx b/compilerplugins/clang/dllmacro.cxx deleted file mode 100644 index 66664888419c..000000000000 --- a/compilerplugins/clang/dllmacro.cxx +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- 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" -#include <iostream> -#include <fstream> - -/** - Check the usage of the various DLL visibility macros. - */ -class DllMacro final: - public RecursiveASTVisitor<DllMacro>, public loplugin::Plugin -{ -public: - explicit DllMacro(InstantiationData const & data): Plugin(data) {} - - bool VisitNamedDecl(NamedDecl const * decl); - -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()); - } - } -}; - -bool DllMacro::VisitNamedDecl(NamedDecl const * decl) { - if (!decl->getLocation().isInvalid() && ignoreLocation(decl)) { - return true; - } - auto a = decl->getAttr<VisibilityAttr>(); - if (a == nullptr) { - 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; - } - if (a->getVisibility() == VisibilityAttr::Hidden) { - 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(); - } - } - else if (a->getVisibility() == VisibilityAttr::Default && !a->isInherited()) - { - auto p = dyn_cast<CXXRecordDecl>(decl); - if (p && p->isCompleteDefinition() && !p->getDescribedClassTemplate()) { - // don't know what these macros mean, leave them alone - auto macroLoc = a->getLocation(); - while (compiler.getSourceManager().isMacroBodyExpansion(macroLoc)) { - auto macroName = Lexer::getImmediateMacroName( - macroLoc, compiler.getSourceManager(), - compiler.getLangOpts()); - if (macroName == "SAL_EXCEPTION_DLLPUBLIC_EXPORT") - return true; - if (macroName == "VCL_PLUGIN_PUBLIC") - return true; - macroLoc = compiler.getSourceManager().getImmediateMacroCallerLoc(macroLoc); - } - for (auto it = p->method_begin(); it != p->method_end(); ++it) { - if (!it->hasInlineBody()) { - return true; - } - } - report( - DiagnosticsEngine::Warning, - "unnecessary *DLLPUBLIC declaration for class completely defined in header file", - a->getLocation()) - << decl->getSourceRange(); - } - } - return true; -} - -static loplugin::Plugin::Registration<DllMacro> reg("dllmacro"); - -/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ 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: */ |