office-gobmx/compilerplugins/clang/dllprivate.cxx
Michael Weghorn 62c7d89c6a loplugin:dllprivate: Extend for new qtbase macro
Qt's qtbase commit [1]

    commit cecca90ff23ff27b9396defc21abd472b3fe0003
    Author:     Thiago Macieira <thiago.macieira@intel.com>
    AuthorDate: Tue Oct 1 11:26:30 2024 -0700
    Commit:     Thiago Macieira <thiago.macieira@intel.com>
    CommitDate: Tue Nov 12 17:14:46 2024 -0800

        moc: fix support for generating meta objects for nested private classes

introduced a new QT_OBJECT_GADGET_COMMON macro, causing my
`--enable-qt6` clang plugin build with current qtbase git dev
(as of commit 957e2be00a5c45223a5ef842a5f9f2f7b7be882b)
to fail as follows for classes using the Q_OBJECT macro:

    In file included from /home/michi/development/git/libreoffice/vcl/qt6/QtAccessibleRegistry.cxx:10:
    In file included from /home/michi/development/git/libreoffice/vcl/qt6/../qt5/QtAccessibleRegistry.cxx:11:
    In file included from /home/michi/development/git/libreoffice/vcl/inc/qt6/QtXAccessible.hxx:10:
    /home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtXAccessible.hxx:27:5: error: declaration nested in DLLPRIVATE declaration redundantly marked as DLLPRIVATE [loplugin:dllprivate]
       27 |     Q_OBJECT
          |     ^~~~~~~~
    /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qtmetamacros.h:145:5: note: expanded from macro 'Q_OBJECT'
      145 |     QT_OBJECT_GADGET_COMMON \
          |     ^~~~~~~~~~~~~~~~~~~~~~~
    /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qtmetamacros.h:132:5: note: expanded from macro 'QT_OBJECT_GADGET_COMMON'
      132 |     Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
          |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qtmetamacros.h:98:39: note: expanded from macro 'Q_DECL_HIDDEN_STATIC_METACALL'
       98 | #define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN
          |                                       ^
    /home/michi/development/git/qt5/qtbase/src/corelib/global/qcompilerdetection.h:190:46: note: expanded from macro 'Q_DECL_HIDDEN'
      190 | #    define Q_DECL_HIDDEN     __attribute__((visibility("hidden")))
          |                                              ^
    /home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtXAccessible.hxx:25:7: note: parent declaration is here [loplugin:dllprivate]
       25 | class QtXAccessible : public QObject
          | ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       26 | {
          | ~
       27 |     Q_OBJECT
          |     ~~~~~~~~
       28 |
       29 | public:
          | ~~~~~~~
       30 |     QtXAccessible(css::uno::Reference<css::accessibility::XAccessible> xAccessible);
          |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       31 |
       32 |     /** Reference to the XAccessible.
          |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       33 |       * This is cleared once it has been passed to the QtAccessibleWidget,
          |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       34 |       * which then keeps an own reference and takes care of all required
          |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       35 |       * access to the XAccessible for the Qt a11y bridge. */
          |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       36 |     css::uno::Reference<css::accessibility::XAccessible> m_xAccessible;
          |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       37 | };
          | ~
    1 error generated.
    make[1]: *** [/home/michi/development/git/libreoffice/solenv/gbuild/LinkTarget.mk:339: /home/michi/development/git/libreoffice/workdir/CxxObject/vcl/qt6/QtAccessibleRegistry.o] Error 1

Extend the plugin to also take the new macro into account in
addition to Q_OBJECT.

[1] https://code.qt.io/cgit/qt/qtbase.git/commit/?id=cecca90ff23ff27b9396defc21abd472b3fe0003

Change-Id: I990f0b25010b3a0f0cc3902f732b93d13bb85d78
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176702
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
2024-11-18 10:17:08 +01:00

86 lines
3.1 KiB
C++

/* -*- 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/.
*/
#ifndef LO_CLANG_SHARED_PLUGINS
#include "plugin.hxx"
namespace {
class DllPrivate final:
public loplugin::FilteringPlugin<DllPrivate>
{
public:
explicit DllPrivate(loplugin::InstantiationData const & data): FilteringPlugin(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()))
{
StringRef macroName = Lexer::getImmediateMacroName(
decl->getLocation(), compiler.getSourceManager(),
compiler.getLangOpts());
// macros from Qt's qtbase module
if (macroName == "Q_OBJECT" || macroName == "QT_OBJECT_GADGET_COMMON")
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;
}
bool preRun() 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:
return !compiler.getPreprocessor().getIdentifierInfo("DISABLE_DYNLOADING")
->hasMacroDefinition();
}
void run() override {
if (preRun()) {
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
}
}
};
static loplugin::Plugin::Registration<DllPrivate> dllprivate("dllprivate");
} // namespace
#endif // LO_CLANG_SHARED_PLUGINS
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */