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