62c7d89c6a
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>
86 lines
3.1 KiB
C++
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: */
|