compilerplugins/clang/dllprivate.cxx |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

New commits:
commit 62c7d89c6a968f162f0ae53288574d0f3a685369
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Mon Nov 18 08:37:34 2024 +0100
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Mon Nov 18 10:17:08 2024 +0100

    loplugin:dllprivate: Extend for new qtbase macro
    
    Qt's qtbase commit [1]
    
        commit cecca90ff23ff27b9396defc21abd472b3fe0003
        Author:     Thiago Macieira <thiago.macie...@intel.com>
        AuthorDate: Tue Oct 1 11:26:30 2024 -0700
        Commit:     Thiago Macieira <thiago.macie...@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.wegh...@posteo.de>

diff --git a/compilerplugins/clang/dllprivate.cxx 
b/compilerplugins/clang/dllprivate.cxx
index 5fbace1010b7..b041bb6cc820 100644
--- a/compilerplugins/clang/dllprivate.cxx
+++ b/compilerplugins/clang/dllprivate.cxx
@@ -27,14 +27,14 @@ public:
         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
+        if 
(compiler.getSourceManager().isMacroBodyExpansion(decl->getLocation()))
         {
-            return true;
+            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) {

Reply via email to