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

0001 #include <QtCore/QList>
0002 #include <QtCore/QString>
0003 #include <QtCore/QStringList>
0004 #include <QtCore/QMap>
0005 #include <QtCore/QFile>
0006 #include <QtCore/QHash>
0007 #include <QtCore/QSet>
0008 #include <QtCore/QJsonObject>
0009 
0010 QList<int> getList()
0011 {
0012     return QList<int>();
0013 }
0014 void detach1()
0015 {
0016     getList().first(); // Warning
0017 }
0018 
0019 void detach2()
0020 {
0021     getList().at(0); // OK
0022 }
0023 
0024 void lvalue()
0025 {
0026     QStringList s;
0027     s.first(); // OK
0028 }
0029 
0030 QStringList test_string() { return {}; }
0031 QStringList& test_string_ref() { static QStringList s; return s; }
0032 QStringList * test_string_ptr() { return {}; }
0033 const QStringList test_const_string() { return {}; }
0034 const QStringList & test_const_string_ref() { static QStringList s; return s; }
0035 const QStringList * test_const_string_ptr() { return {}; }
0036 
0037 void qstrings()
0038 {
0039     QString s;
0040     s.toLatin1().data(); // OK, list isn't shared
0041     test_string().first(); // Warning
0042     test_const_string().first(); // OK
0043     test_const_string_ref().first(); // OK
0044     test_const_string_ptr()->first(); // OK
0045 
0046     test_string().first(); // Warning
0047     test_string_ref().first(); // Warning
0048     test_string_ptr()->first(); // OK
0049 }
0050 
0051 void more()
0052 {
0053     QFile::encodeName("foo").data();
0054 }
0055 
0056 void foo(QStringList *list)
0057 {
0058     auto it = list->begin();
0059 }
0060 
0061 typedef QMap<int, QStringList> StringMap;
0062 Q_GLOBAL_STATIC(StringMap, sISOMap)
0063 void test_global_static()
0064 {
0065     sISOMap()->insert(1, QStringList());
0066     sISOMap->insert(1, QStringList());
0067 }
0068 
0069 struct TestThis : public QList<int>
0070 {
0071     void foo()
0072     {
0073         begin();
0074     }
0075 };
0076 
0077 class Foo
0078 {
0079 public:
0080     QStringList list;
0081 };
0082 
0083 Foo * getFoo() { return new Foo(); }
0084 Foo getFoo2() { return Foo(); }
0085 
0086 void testThroughPointer()
0087 {
0088     Foo *f;
0089     f->list.first(); // OK
0090     getFoo()->list.first(); // OK
0091     getFoo2().list.first(); // OK
0092 }
0093 
0094 QMap<int,int> getMap() { return {}; };
0095 void testWriteMethod()
0096 {
0097     getMap().insert(1,1); // Warning
0098     int a = getMap().take(1); // Warning
0099 }
0100 
0101 void testSubscriptOperator()
0102 {
0103     getList()[0]; // Warning
0104     if (test_string()[0].isEmpty()) {} // Warning
0105     getMap()[0]; // Warning
0106     auto m = getMap();
0107     m[0];
0108 }
0109 
0110 typedef QList<int> IntList;
0111 IntList getIntList() { return {}; }
0112 void testTypedef()
0113 {
0114     getIntList()[0]; // Warning
0115 }
0116 
0117 QStringList getStringList() { return {}; }
0118 
0119 void testDerivedClass()
0120 {
0121     getStringList().first(); // Warning
0122     getStringList()[0]; // Warning
0123                         //
0124                         //
0125 }
0126 
0127 void testQStringListSpecificMethods()
0128 {
0129     getStringList().removeDuplicates();
0130 }
0131 
0132 QString getString() { return ""; }
0133 void testQString()
0134 {
0135     getString().begin(); // Warning
0136     getString()[1]; // Warning
0137 }
0138 
0139 extern QHash<QString, int> &initializers();
0140 QString getStr() { return QString(); }
0141 
0142 static auto bar = [] {
0143         return initializers().insert(getStr(), 1); // OK
0144     }();
0145 
0146 
0147 QSet<int> getSet() { return {}; }
0148 
0149 void testIntersect()
0150 {
0151     QSet<int> other;
0152     auto s = getSet().intersect(other); // OK
0153 }
0154 
0155 QJsonObject getObj(){return {};}
0156 void testJsonDetach() {
0157     getObj()[QLatin1String("bla")]; // Warning
0158     getObj().find(QLatin1String("bla")); // Warning
0159     getObj().value(QLatin1String("bla")); // OK
0160 }