qt5base-lts/tests/auto/tools/qmake/testdata/rawString/main.cpp
Edward Welbourne 515b905150 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>
2017-08-24 14:27:50 +00:00

133 lines
3.4 KiB
C++

/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
// 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>
/* 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