File indexing completed on 2024-04-28 05:38:43

0001 #include <QtCore/QList>
0002 #include <QtCore/QString>
0003 #include <QtCore/QJsonArray>
0004 #include <QtCore/QSequentialIterable>
0005 
0006 struct Trivial
0007 {
0008     int a;
0009 };
0010 
0011 struct BigTrivial
0012 {
0013     int a, b, c, d, e;
0014     void constFoo() const {}
0015     void nonConstFoo() {}
0016 };
0017 
0018 struct SmallNonTrivial
0019 {
0020     int a;
0021     ~SmallNonTrivial() {}
0022 };
0023 
0024 extern void nop();
0025 extern void nop2(BigTrivial &); // non-const-ref
0026 extern void nop3(const BigTrivial &); // const-ref
0027 extern void nop4(BigTrivial *); // pointer
0028 
0029 void test_missing_ref()
0030 {
0031     const QList<Trivial> trivials;
0032     const QList<BigTrivial> bigTrivials;
0033     const QList<SmallNonTrivial> smallNonTrivials;
0034 
0035     // Test #2: No warning
0036     for (Trivial t : trivials) {
0037         nop();
0038     }
0039 
0040     // Test #3: No warning
0041     for (BigTrivial t : bigTrivials) {
0042         nop();
0043     }
0044 
0045     // Test #4: Warning
0046     for (SmallNonTrivial t : smallNonTrivials) {
0047         nop();
0048     }
0049 
0050     // Test #5: No Warning
0051     for (const BigTrivial t : bigTrivials) {
0052         t.constFoo();
0053     }
0054 
0055     // Test #6: No warning
0056     for (BigTrivial t : bigTrivials) {
0057         t.nonConstFoo();
0058     }
0059 
0060     // Test #7: No warning
0061     for (BigTrivial t : bigTrivials) {
0062         t = BigTrivial();
0063     }
0064 
0065     // Test #8: No warning
0066     for (BigTrivial t : bigTrivials) {
0067         nop2(t);
0068     }
0069 
0070     // Test #9: No Warning
0071     for (BigTrivial t : bigTrivials) {
0072         nop3(t);
0073     }
0074 
0075     // Test #9: No warning
0076     for (BigTrivial t : bigTrivials) {
0077         nop4(&t);
0078     }
0079 
0080     // Test #10: No warning (bug #362587)
0081     QSequentialIterable si = QVariant().value<QSequentialIterable>();
0082     for (const auto &s : si) {}
0083 }
0084 
0085 void test_add_ref_fixits()
0086 {
0087     QStringList strlist;
0088     for (const QString s : strlist) {} // should add &
0089     for (QString s : strlist) {} // should add const-&
0090 
0091     for (QString s : strlist) {  // shouldn't warn
0092         s = s.toLower();
0093     }
0094 
0095     for (QString s : strlist) {  // shouldn't warn
0096         s.clear();
0097     }
0098 }
0099 
0100 void test_json_array()
0101 {
0102     QJsonArray array;
0103     const QJsonArray const_array;
0104     for (const auto a : array) {} // OK
0105     for (const QJsonValue a : const_array) {} // Warn
0106     for (const QJsonValue &a : const_array) {} // OK
0107 }