1 #include <QtCore/QList>
2 #include <QtCore/QString>
3 #include <QtCore/QStringList>
4 #include <QtCore/QMap>
5 #include <QtCore/QFile>
6 #include <QtCore/QHash>
7 #include <QtCore/QSet>
8 
getList()9 QList<int> getList()
10 {
11     return QList<int>();
12 }
13 
detach1()14 void detach1()
15 {
16     getList().first(); // Warning
17 }
18 
detach2()19 void detach2()
20 {
21     getList().at(0); // OK
22 }
23 
lvalue()24 void lvalue()
25 {
26     QStringList s;
27     s.first(); // OK
28 }
29 
test_string()30 QStringList test_string() { return {}; }
test_string_ref()31 QStringList& test_string_ref() { static QStringList s; return s; }
test_string_ptr()32 QStringList * test_string_ptr() { return {}; }
test_const_string()33 const QStringList test_const_string() { return {}; }
test_const_string_ref()34 const QStringList & test_const_string_ref() { static QStringList s; return s; }
test_const_string_ptr()35 const QStringList * test_const_string_ptr() { return {}; }
36 
qstrings()37 void qstrings()
38 {
39     QString s;
40     s.toLatin1().data(); // OK, list isn't shared
41     test_string().first(); // Warning
42     test_const_string().first(); // OK
43     test_const_string_ref().first(); // OK
44     test_const_string_ptr()->first(); // OK
45 
46     test_string().first(); // Warning
47     test_string_ref().first(); // Warning
48     test_string_ptr()->first(); // OK
49 }
50 
51 
maps()52 void maps()
53 {
54     QMap<int, QStringList> map;
55     map.value(0).first(); // OK, value() returns const T
56     map[0].removeAll("asd"); // OK
57     map.values().first(); // OK, QMap::values() isn't shared
58 }
59 
more()60 void more()
61 {
62     QFile::encodeName("foo").data();
63 }
64 
foo(QStringList * list)65 void foo(QStringList *list)
66 {
67     auto it = list->begin();
68 }
69 
70 typedef QMap<int, QStringList> StringMap;
Q_GLOBAL_STATIC(StringMap,sISOMap)71 Q_GLOBAL_STATIC(StringMap, sISOMap)
72 void test_global_static()
73 {
74     sISOMap()->insert(1, QStringList());
75     sISOMap->insert(1, QStringList());
76 }
77 
test_ctor()78 void test_ctor()
79 {
80     QStringList().first();
81     QByteArray key = "key";
82     QByteArray(key + key).data();
83 }
84 
85 struct TestThis : public QList<int>
86 {
fooTestThis87     void foo()
88     {
89         begin();
90     }
91 };
92 
93 class Foo
94 {
95 public:
96     QStringList list;
97 };
98 
getFoo()99 Foo * getFoo() { return new Foo(); }
getFoo2()100 Foo getFoo2() { return Foo(); }
101 
testThroughPointer()102 void testThroughPointer()
103 {
104     Foo *f;
105     f->list.first(); // OK
106     getFoo()->list.first(); // OK
107     getFoo2().list.first(); // OK
108 }
109 
getMap()110 QMap<int,int> getMap() { return {}; };
testWriteMethod()111 void testWriteMethod()
112 {
113     getMap().insert(1,1); // Warning
114     int a = getMap().take(1); // Warning
115 }
116 
testSubscriptOperator()117 void testSubscriptOperator()
118 {
119     getList()[0]; // Warning
120     if (test_string()[0].isEmpty()) {} // Warning
121     getMap()[0]; // Warning
122     auto m = getMap();
123     m[0];
124 }
125 
126 typedef QList<int> IntList;
getIntList()127 IntList getIntList() { return {}; }
testTypedef()128 void testTypedef()
129 {
130     getIntList()[0]; // Warning
131 }
132 
getStringList()133 QStringList getStringList() { return {}; }
getMultiMap()134 QMultiMap<int,int> getMultiMap() { return {}; }
testDerivedClass()135 void testDerivedClass()
136 {
137     getStringList().first(); // Warning
138     getStringList()[0]; // Warning
139     getMultiMap().begin(); // Warning
140     getMultiMap().insert(1, 1); // Warning
141 }
142 
testQStringListSpecificMethods()143 void testQStringListSpecificMethods()
144 {
145     getStringList().removeDuplicates();
146 }
147 
getString()148 QString getString() { return ""; }
testQString()149 void testQString()
150 {
151     getString().begin(); // Warning
152     getString()[1]; // Warning
153 }
154 
155 extern QHash<QString, int> &initializers();
getStr()156 QString getStr() { return QString(); }
157 
__anone4d6ae6c0102null158 static auto bar = [] {
159         return initializers().insert(getStr(), 1); // OK
160     }();
161 
162 
getSet()163 QSet<int> getSet() { return {}; }
164 
testIntersect()165 void testIntersect()
166 {
167     QSet<int> other;
168     auto s = getSet().intersect(other); // OK
169 }
170