summaryrefslogtreecommitdiff
path: root/compilerplugins
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
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')
-rw-r--r--compilerplugins/clang/dllmacro.cxx112
-rw-r--r--compilerplugins/clang/dllprivate.cxx79
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: */