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

0001 #include <QtCore/QString>
0002 #include <QtCore/QStringList>
0003 #include <QtCore/QDebug>
0004 
0005 const char * some_char_pointer_indirection(const char *)
0006 {
0007     return nullptr;
0008 }
0009 
0010 const char * some_char_pointer()
0011 {
0012     return nullptr;
0013 }
0014 
0015 void test()
0016 {
0017     QString s1;
0018     const char *cstring = "foo";
0019     s1.contains("string"); // Warning
0020     s1.contains(some_char_pointer()); // OK
0021 
0022     QString s2 = "string"; // Warning
0023     QString s3 = QStringLiteral("string"); // OK
0024     QString s4(some_char_pointer()); // OK
0025 
0026     s1 += "foo"; // Warning
0027     s1 += QStringLiteral("foo"); // OK
0028     s1 += QLatin1String("foo"); // OK
0029 
0030     QString s5 = QString::fromLatin1("BAR"); // Warning
0031     QString s6 = QString::fromUtf8("BAR"); // Warning
0032     QString s7 = QString::fromLatin1(some_char_pointer()); // OK
0033     QString s8 = QString::fromUtf8(some_char_pointer()); // OK
0034     QString s81 = QString::fromUtf8(some_char_pointer_indirection("foo")); // OK
0035     QString s123 = QString::fromLatin1(some_char_pointer_indirection("foo")); // OK
0036 
0037     QString s9 = QLatin1String("string"); // Warning
0038     s9 =  QLatin1String("string"); // Warning
0039     s9 =  QLatin1String(some_char_pointer_indirection("foo")); // OK
0040     QString s10 = true ? QLatin1String("string1") : QLatin1String("string2"); // Warning
0041     s10 = true ? QLatin1String("string1") :  QLatin1String("string2"); // Warning
0042 
0043     QString s11 = QString(QLatin1String("foo")); // Warning
0044     QStringList stringList;
0045     stringList << QString::fromLatin1("foo", 1); // OK
0046     QString s12 = QLatin1String(""); // OK, QString is optimized for the empty case
0047     QString s = QLatin1String(cstring + sizeof("foo")); // OK
0048     s = QString::fromLatin1("bar %1").arg(1); // Warning
0049     s = QString::fromLatin1(true ? "foo" : "foo2").arg(1); // Warning
0050     s += QString::fromLatin1(  // Warning: Multi-line, to test FIXIT
0051         "foo" );
0052     QString::fromLatin1(true ? cstring : "cstring"); // OK
0053     QString escaped = "\\\\"; // Warning
0054     QString s13 = QString("foo"); // Warning
0055     QString s14 = QString(""); // Warning
0056     QString s15 = ""; // Warning
0057     s15.startsWith(QLatin1String("ff")); // OK
0058     s15.startsWith("ff"); // Warning, should be QLatin1String
0059     s15.contains("ff"); // Warning, should be QStringLiteral
0060     s15.indexOf("ff"); // Warning, should be QStringLiteral
0061 }
0062 
0063 
0064 
0065 
0066 
0067 
0068 
0069 
0070 struct A
0071 {
0072     A() : member(QLatin1String("foo")) {} // Warning
0073     QString member;
0074 };
0075 
0076 struct A2
0077 {
0078     A2() : member(QStringLiteral("foo")) // OK
0079          , member2(QString(QLatin1String("foo"))) {} // Warning
0080     void  test(const QString &calendarType = QLatin1String("gregorian") ); // Warning
0081     QString member;
0082     QString member2;
0083 };
0084 
0085 void test3()
0086 {
0087     QString s;
0088     if (s == QString::fromLatin1("foo")) // Warning
0089         return;
0090     if (s == QString::fromLatin1("foo %1").arg(1)) // Warning
0091         return;
0092 }
0093 
0094 void test4(const QString &) {}
0095 
0096 void test5()
0097 {
0098     test4(QString::fromLatin1("foo")); // Warning
0099     QString s;
0100     s.contains(QString::fromLatin1("a")); // Warning
0101     s.compare(QStringLiteral("a"), QString::fromLatin1("a")); // Warning
0102 }
0103 
0104 #include <exception>
0105 void exceptionTest() // Just to test a crash
0106 {
0107     try {
0108 
0109     } catch (std::exception e) {
0110 
0111     }
0112 }
0113 
0114 QStringList returns_stringlist(QString) { return {}; }
0115 
0116 void test_foreach()
0117 {
0118     foreach (const QString &s, returns_stringlist(QLatin1String("bar"))) // Warning
0119     {
0120     }
0121 }
0122 
0123 void testCharsets()
0124 {
0125     QString s = "é";
0126     s += "é";
0127     s += "e";
0128     s.compare("é", "e");
0129     s.startsWith("é");
0130     s.startsWith("e");
0131     foreach (const QString &s, returns_stringlist(QLatin1String("éÈ"))) { }
0132     QString s11 = QString(QLatin1String("é"));
0133 
0134     if (s == QString::fromLatin1("foó"))
0135         return;
0136     if (s == QString::fromLatin1("foó %1").arg(1))
0137         return;
0138     s.contains(QString::fromLatin1("é"));
0139     s += QString::fromLatin1(
0140         "fóó" );
0141     QString s123 = QString::fromLatin1(some_char_pointer_indirection("fóó"));
0142     QString s9 = QLatin1String("stringéééé");
0143 }
0144 
0145 struct TestCharsets
0146 {
0147     TestCharsets() : member(QStringLiteral("é"))
0148          , member2(QString(QLatin1String("é"))) {} // Warning
0149     void  test(const QString &calendarType = QLatin1String("éééé´e") );
0150     void test2();
0151     QString member;
0152     QString member2;
0153 };
0154 
0155 
0156 
0157 
0158 
0159 
0160 
0161 
0162 
0163 
0164 
0165 void moreShouldBeQLatin1String()
0166 {
0167     QString s;
0168     bool b = (s == QString::fromLatin1("="));
0169     if (s.startsWith("Version=5")) {}
0170     if (s.startsWith(QLatin1String("Version=5"))) {} // OK
0171     QString result = QString::fromLatin1("Enum") + s;
0172 }
0173 
0174 void TestCharsets::test2()
0175 {
0176     QString s = QString::fromLatin1("é"); // Can't fix this weird one
0177     QString s2 = QString::fromUtf8("é");
0178     s2 += QString::fromLatin1("é");
0179     s2 += QString::fromUtf8("é");
0180     s = "á";
0181     s += "á";
0182     QString("á");
0183     QStringList slist;
0184     slist << "á" << "a";
0185 }
0186 
0187 
0188 
0189 #if QT_MAJOR_VERSION == 5
0190 #include <QtCore/QRegExp>
0191 void testBlacklistedQRegExp()
0192 {
0193     QRegExp exp1("literal");
0194     QRegExp exp2(QLatin1String("literal"));
0195 }
0196 #endif
0197 
0198 
0199 void charsetEdgeCase()
0200 {
0201     test4(QLatin1String("ááá"));
0202 }
0203 
0204 void testQDebug()
0205 {
0206     qDebug() << "test"; // OK
0207 }
0208 
0209 void testEmpty()
0210 {
0211     QStringList list = QStringList() << "foo" << "";
0212 }
0213 
0214 
0215 void test_bug358732()
0216 {
0217     QString("foo").asprintf("0x%02X", 0x1E); // Warn and use QSL
0218     QString("").asprintf("0x%02X", 0x1E); // Warn and use QSL
0219 }
0220 
0221 
0222 struct QTestData {};
0223 
0224 template<typename T>
0225 QTestData &operator<<(QTestData &data, const T &value);
0226 
0227 void test_QTestData()
0228 {
0229     QTestData t;
0230     t << QString::fromLatin1("foo");
0231 }
0232 
0233 void test_QStringList_streamOp()
0234 {
0235     QStringList list;
0236     list << QStringLiteral("foo") << QLatin1String("foo") << QString::fromLatin1("foo") << "foo";
0237     list += QStringLiteral("foo");
0238     list += QLatin1String("foo");
0239     list += QString::fromLatin1("foo");
0240     list += "foo";
0241 }
0242 
0243 void testQLatin1String2Args()
0244 {
0245     QString s2 = QLatin1String("foo", 3);
0246 }
0247 
0248 QString s = QString::fromUtf8("ö");
0249 QString s2 = QString::fromUtf8("\xc3\xb6");
0250 QString s3 = true ? "ö" : "\xc3\xb6";
0251 
0252 
0253 // bug #391807
0254 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strUnit, (QLatin1String("unit"))) // OK, since QStringLiteral doesn't work inside Q_GLOBAL_STATIC_WITH_ARGS
0255 
0256 void testEmptyString()
0257 {
0258     QString s1, s2, s3;
0259     if (s1 == "" && s2 != "" && s3 == "foo")
0260         s1 = s3;
0261 }