File indexing completed on 2024-05-05 05:41:36

0001 #include <QtCore/QString>
0002 #include <QtWidgets/QMenu>
0003 #include <QtCore/QTimer>
0004 void another_global();
0005 void test()
0006 {
0007     QObject *o1;
0008     QObject *o2;
0009     QObject::connect(o1, &QObject::destroyed,
0010                     [=] { o2->deleteLater(); }); // Warn
0011 
0012     QObject::connect(o1, &QObject::destroyed, o2,
0013                     [=] { o2->deleteLater(); }); // OK
0014 
0015     QObject::connect(o1, &QObject::destroyed,
0016                     [=] { o1->deleteLater(); }); // OK
0017 
0018     QObject::connect(o1, &QObject::destroyed,
0019                     [=] { int a; a = 1; }); // OK
0020 }
0021 
0022 class MyObject : public QObject
0023 {
0024 public:
0025     void foo();
0026 
0027     void test()
0028     {
0029         MyObject *o2;
0030         connect(o2, &QObject::destroyed, [this] { // Warn
0031             foo();
0032         });
0033 
0034         connect(this, &QObject::destroyed, [this] { // OK
0035             foo();
0036         });
0037 
0038         connect(this, &QObject::destroyed, [o2] { // Warn
0039             o2->foo();
0040         });
0041 
0042         connect(m_member, &QObject::destroyed, [this] { // Warn (this is dereferenced)
0043             m_member->deleteLater();
0044         });
0045 
0046         connect(m_member, &QObject::destroyed, [this] { // Warn
0047                 test();
0048             });
0049 
0050         connect(m_member, &QObject::destroyed, [this] { // OK
0051                 ::test();
0052             });
0053 
0054         connect(m_member, &QObject::destroyed, [] { // OK
0055                 another_global();
0056             });
0057 
0058         MyObject *other;
0059         connect(other->m_member, &QObject::destroyed, [other] { // Warn (other might be deleted before)
0060             other->m_member->deleteLater();
0061         });
0062 
0063         connect(other->m_member, &QObject::destroyed, [other] { // Warn
0064             other->m_member2->deleteLater();
0065         });
0066 
0067         MyObject *other2;
0068         connect(other->m_member, &QObject::destroyed, [other, other2] { // Warn
0069             other2->m_member->deleteLater();
0070         });
0071 
0072     }
0073 
0074     QObject *m_member;
0075     QObject *m_member2;
0076 };
0077 
0078 void testTimer()
0079 {
0080     QObject *o;
0081     QTimer::singleShot(0, [] {}); // Warn
0082     QTimer::singleShot(0, o, [] {}); // OK
0083 
0084     QTimer::singleShot(0, Qt::CoarseTimer, [] {}); // Warn
0085     QTimer::singleShot(0, Qt::CoarseTimer, o, [] {}); // OK
0086 }
0087 
0088 void testQMenu()
0089 {
0090     MyObject o;
0091     QMenu menu;
0092     menu.addAction("foo", &o, &MyObject::test); // OK
0093     menu.addAction("foo", &o, []{}); // OK
0094     menu.addAction("foo", []{}); // Warn
0095 }