summaryrefslogtreecommitdiffstats
path: root/tests/auto/tools/qmake/testdata/rawString/main.cpp
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2016-09-06 19:21:50 +0200
committerEdward Welbourne <edward.welbourne@qt.io>2017-08-24 14:27:50 +0000
commit515b9051505d61af6be0eba87616c7281ee4ce62 (patch)
tree69bea4769022c2003f6ddf1cd1c8e1699e4b7f9e /tests/auto/tools/qmake/testdata/rawString/main.cpp
parent797530c3f81b6c5fb8e25e431105fdcd22d8775a (diff)
Adapt qmake's raw-string parser to avoid confusion by macros
A macro name ending in R might expand to a string; if this precedes a string constant, we're juxtaposing the strings. My first parser for raw strings would mistake it for a raw string instead, ignoring the part of the identifier before R. Re-worked the exploration of what came before the string to catch these cases, too. The backwards parsing would also allow any messy jumble of [RLUu8]* as prefix for the string; but in fact R must (if present) be last in the prefix and *it* can have at most one prefix, [LUu] or u8. Anything else is an identifier that happens to precede the string. Reworked the parsing to allow only one prefix and not treat R specially unless it's immediately (modulo BSNL) before the string's open-quotes. Add link to the cppreference page about string literals, on which the grammar now parsed is based. Added a test for the issue this addresses. Verified that this fails on 5.6, dev and 5.9 without the fix. Expanded the existing test to cover R-with-prefix cases. Task-number: QTBUG-55633 Change-Id: I541486c2ec909cfb42050907c84bee83ead4a2f4 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'tests/auto/tools/qmake/testdata/rawString/main.cpp')
-rw-r--r--tests/auto/tools/qmake/testdata/rawString/main.cpp101
1 files changed, 100 insertions, 1 deletions
diff --git a/tests/auto/tools/qmake/testdata/rawString/main.cpp b/tests/auto/tools/qmake/testdata/rawString/main.cpp
index 53a28f7bc0..bc557f39f8 100644
--- a/tests/auto/tools/qmake/testdata/rawString/main.cpp
+++ b/tests/auto/tools/qmake/testdata/rawString/main.cpp
@@ -26,8 +26,107 @@
**
****************************************************************************/
+// macro names that *aren't* string-literal-prefixes:
+#define Ru8 "rue-it"
+#define RL "real life"
+#define Ru "are you ?"
+#define RU "Are You ?"
+#define LLR "double-hockey-sticks"
+#define LUR "Tricky"
+#define LuR "tricky"
+#define Lu8R "l'uber"
+#define UUR "Double-Yew"
+#define ULR "Eweler"
+#define UuR "You ... you-are"
+#define Uu8R "You ... you *ate* our ..."
+#define uuR "water"
+#define uLR "eweler"
+#define uUR "double-Your"
+#define uu8R "totally uber"
+#define u8u8R "rubber-you"
+#define u8LR "Uber left-to-right"
+#define u8UR "Uber Upper-Right"
+#define u8uR "Uber upper-right"
+#define Ru8R "bouncy"
+#define RLR "Marching"
+#define RuR "Rossum's general-purpose workers"
+#define RUR "Rossum's Universal Robots"
+
+static const char monstrosity[] =
+ Ru8"Ru8("
+ RL"RL("
+ Ru"Ru("
+ RU"RU("
+ LLR"LLR("
+ LUR"LUR("
+ LuR"LuR("
+ Lu8R"Lu8R("
+ UUR"UUR("
+ ULR"ULR("
+ UuR"UuR("
+ Uu8R"Uu8R("
+ uuR"uuR("
+ uLR"uLR("
+ uUR"uUR("
+ uu8R"uu8R("
+ u8u8R"u8u8R("
+ u8LR"u8LR("
+ u8UR"u8UR("
+ u8uR"u8uR("
+ Ru8R"Ru8R("
+ RLR"RLR("
+ RuR"RuR("
+ RUR"RUR("
+ "Finally, some content";
+
+#include <moc_object2.cpp>
+
+static const char closure[] =
+ ")RUR"
+ ")RuR"
+ ")RLR"
+ ")Ru8R"
+ ")u8uR"
+ ")u8UR"
+ ")u8LR"
+ ")u8u8R"
+ ")uu8R"
+ ")uUR"
+ ")uLR"
+ ")uuR"
+ ")Uu8R"
+ ")UuR"
+ ")ULR"
+ ")UUR"
+ ")Lu8R"
+ ")LuR"
+ ")LUR"
+ ")LLR"
+ ")RU"
+ ")Ru"
+ ")RL"
+ ")Ru8";
+// If moc got confused, the confusion should now be over
+
+// Real raw strings, not actually leaving us inside any comments:
static const char raw[] = R"blah(lorem " ipsum /*)blah"\
;
+static const wchar_t wider[] = LR"blah(lorem " ipsum /*)blah"\
+;
+static const char32_t UCS4[] = UR"blah(lorem " ipsum /*)blah"\
+;
+static const char16_t UCS2[] = uR"blah(lorem " ipsum /*)blah"\
+;
+static const char utf8[] = u8R"blah(lorem " ipsum /*)blah"\
+;
#include <moc_object1.cpp>
-int main () { return 0; }
+/* Avoid unused variable warnings by silly uses of arrays: */
+#define final(x) x[sizeof(x) - 1] // 0, of course
+int main () {
+ return final(raw)
+ * (final(wider) - final(UCS4))
+ * (final(UCS2) - final(utf8))
+ * (final(monstrosity) - final(closure));
+}
+#undef final