File indexing completed on 2024-05-12 17:13:25

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 
0009 QList<int> getList()
0010 {
0011     return QList<int>();
0012 }
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 
0052 void maps()
0053 {
0054     QMap<int, QStringList> map;
0055     map.value(0).first(); // OK, value() returns const T
0056     map[0].removeAll("asd"); // OK
0057     map.values().first(); // OK, QMap::values() isn't shared
0058 }
0059 
0060 void more()
0061 {
0062     QFile::encodeName("foo").data();
0063 }
0064 
0065 void foo(QStringList *list)
0066 {
0067     auto it = list->begin();
0068 }
0069 
0070 typedef QMap<int, QStringList> StringMap;
0071 Q_GLOBAL_STATIC(StringMap, sISOMap)
0072 void test_global_static()
0073 {
0074     sISOMap()->insert(1, QStringList());
0075     sISOMap->insert(1, QStringList());
0076 }
0077 
0078 void test_ctor()
0079 {
0080     QStringList().first();
0081     QByteArray key = "key";
0082     QByteArray(key + key).data();
0083 }
0084 
0085 struct TestThis : public QList<int>
0086 {
0087     void foo()
0088     {
0089         begin();
0090     }
0091 };
0092 
0093 class Foo
0094 {
0095 public:
0096     QStringList list;
0097 };
0098 
0099 Foo * getFoo() { return new Foo(); }
0100 Foo getFoo2() { return Foo(); }
0101 
0102 void testThroughPointer()
0103 {
0104     Foo *f;
0105     f->list.first(); // OK
0106     getFoo()->list.first(); // OK
0107     getFoo2().list.first(); // OK
0108 }
0109 
0110 QMap<int,int> getMap() { return {}; };
0111 void testWriteMethod()
0112 {
0113     getMap().insert(1,1); // Warning
0114     int a = getMap().take(1); // Warning
0115 }
0116 
0117 void testSubscriptOperator()
0118 {
0119     getList()[0]; // Warning
0120     if (test_string()[0].isEmpty()) {} // Warning
0121     getMap()[0]; // Warning
0122     auto m = getMap();
0123     m[0];
0124 }
0125 
0126 typedef QList<int> IntList;
0127 IntList getIntList() { return {}; }
0128 void testTypedef()
0129 {
0130     getIntList()[0]; // Warning
0131 }
0132 
0133 QStringList getStringList() { return {}; }
0134 QMultiMap<int,int> getMultiMap() { return {}; }
0135 void testDerivedClass()
0136 {
0137     getStringList().first(); // Warning
0138     getStringList()[0]; // Warning
0139     getMultiMap().begin(); // Warning
0140     getMultiMap().insert(1, 1); // Warning
0141 }
0142 
0143 void testQStringListSpecificMethods()
0144 {
0145     getStringList().removeDuplicates();
0146 }
0147 
0148 QString getString() { return ""; }
0149 void testQString()
0150 {
0151     getString().begin(); // Warning
0152     getString()[1]; // Warning
0153 }
0154 
0155 extern QHash<QString, int> &initializers();
0156 QString getStr() { return QString(); }
0157 
0158 static auto bar = [] {
0159         return initializers().insert(getStr(), 1); // OK
0160     }();
0161 
0162 
0163 QSet<int> getSet() { return {}; }
0164 
0165 void testIntersect()
0166 {
0167     QSet<int> other;
0168     auto s = getSet().intersect(other); // OK
0169 }