forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/2.6'
This commit is contained in:
7
src/libs/3rdparty/cplusplus/Bind.cpp
vendored
7
src/libs/3rdparty/cplusplus/Bind.cpp
vendored
@@ -3147,13 +3147,12 @@ void Bind::ensureValidClassName(const Name **name, unsigned sourceLocation)
|
||||
return;
|
||||
|
||||
const QualifiedNameId *qName = (*name)->asQualifiedNameId();
|
||||
if (qName)
|
||||
*name = qName->name();
|
||||
const Name *uqName = qName ? qName->name() : *name;
|
||||
|
||||
if (!(*name)->isNameId() && !(*name)->isTemplateNameId()) {
|
||||
if (!uqName->isNameId() && !uqName->isTemplateNameId()) {
|
||||
translationUnit()->error(sourceLocation, "expected a class-name");
|
||||
|
||||
*name = (*name)->identifier();
|
||||
*name = uqName->identifier();
|
||||
if (qName)
|
||||
*name = control()->qualifiedNameId(qName->base(), *name);
|
||||
}
|
||||
|
||||
11
src/libs/3rdparty/cplusplus/Control.cpp
vendored
11
src/libs/3rdparty/cplusplus/Control.cpp
vendored
@@ -173,16 +173,6 @@ public:
|
||||
|
||||
} // end of anonymous namespace
|
||||
|
||||
#ifdef Q_OS_SYMBIAN
|
||||
//Symbian compiler has some difficulties to understand the templates.
|
||||
static void delete_array_entries(std::vector<Symbol *> vt)
|
||||
{
|
||||
std::vector<Symbol *>::iterator it;
|
||||
for (it = vt.begin(); it != vt.end(); ++it) {
|
||||
delete *it;
|
||||
}
|
||||
}
|
||||
#else
|
||||
template <typename _Iterator>
|
||||
static void delete_array_entries(_Iterator first, _Iterator last)
|
||||
{
|
||||
@@ -193,7 +183,6 @@ static void delete_array_entries(_Iterator first, _Iterator last)
|
||||
template <typename _Array>
|
||||
static void delete_array_entries(const _Array &a)
|
||||
{ delete_array_entries(a.begin(), a.end()); }
|
||||
#endif
|
||||
|
||||
class Control::Data
|
||||
{
|
||||
|
||||
84
src/libs/3rdparty/cplusplus/Lexer.cpp
vendored
84
src/libs/3rdparty/cplusplus/Lexer.cpp
vendored
@@ -571,14 +571,25 @@ void Lexer::scan_helper(Token *tok)
|
||||
}
|
||||
}
|
||||
|
||||
if (ch == 'L' || ch == 'u' || ch == 'U') {
|
||||
if (ch == 'L' || ch == 'u' || ch == 'U' || ch == 'R') {
|
||||
// Either a literal or still an identifier.
|
||||
if (_yychar == '"') {
|
||||
yyinp();
|
||||
scanStringLiteral(tok, ch);
|
||||
if (ch == 'R')
|
||||
scanRawStringLiteral(tok);
|
||||
else
|
||||
scanStringLiteral(tok, ch);
|
||||
} else if (_yychar == '\'') {
|
||||
yyinp();
|
||||
scanCharLiteral(tok, ch);
|
||||
} else if (ch != 'R' && _yychar == 'R') {
|
||||
yyinp();
|
||||
if (_yychar == '"') {
|
||||
yyinp();
|
||||
scanRawStringLiteral(tok, ch);
|
||||
} else {
|
||||
scanIdentifier(tok, 1);
|
||||
}
|
||||
} else if (ch == 'u' && _yychar == '8') {
|
||||
yyinp();
|
||||
if (_yychar == '"') {
|
||||
@@ -587,6 +598,14 @@ void Lexer::scan_helper(Token *tok)
|
||||
} else if (_yychar == '\'') {
|
||||
yyinp();
|
||||
scanCharLiteral(tok, '8');
|
||||
} else if (_yychar == 'R') {
|
||||
yyinp();
|
||||
if (_yychar == '"') {
|
||||
yyinp();
|
||||
scanRawStringLiteral(tok, '8');
|
||||
} else {
|
||||
scanIdentifier(tok, 2);
|
||||
}
|
||||
} else {
|
||||
scanIdentifier(tok, 1);
|
||||
}
|
||||
@@ -624,6 +643,67 @@ void Lexer::scanStringLiteral(Token *tok, unsigned char hint)
|
||||
tok->f.kind = T_STRING_LITERAL;
|
||||
}
|
||||
|
||||
void Lexer::scanRawStringLiteral(Token *tok, unsigned char hint)
|
||||
{
|
||||
const char *yytext = _currentChar;
|
||||
|
||||
int delimLength = -1;
|
||||
const char *closingDelimCandidate = 0;
|
||||
while (_yychar) {
|
||||
if (_yychar == '(' && delimLength == -1) {
|
||||
delimLength = _currentChar - yytext;
|
||||
yyinp();
|
||||
} else if (_yychar == ')') {
|
||||
yyinp();
|
||||
if (delimLength == -1)
|
||||
break;
|
||||
closingDelimCandidate = _currentChar;
|
||||
} else {
|
||||
if (delimLength == -1) {
|
||||
if (_yychar == '\\' || std::isspace(_yychar))
|
||||
break;
|
||||
yyinp();
|
||||
} else {
|
||||
if (!closingDelimCandidate) {
|
||||
yyinp();
|
||||
} else {
|
||||
if (_yychar == '"') {
|
||||
if (delimLength == _currentChar - closingDelimCandidate) {
|
||||
// Got a matching closing delimiter.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure this continues to be a valid candidate.
|
||||
if (_yychar != *(yytext + (_currentChar - closingDelimCandidate)))
|
||||
closingDelimCandidate = 0;
|
||||
|
||||
yyinp();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int yylen = _currentChar - yytext;
|
||||
|
||||
if (_yychar == '"')
|
||||
yyinp();
|
||||
|
||||
if (control())
|
||||
tok->string = control()->stringLiteral(yytext, yylen);
|
||||
|
||||
if (hint == 'L')
|
||||
tok->f.kind = T_RAW_WIDE_STRING_LITERAL;
|
||||
else if (hint == 'U')
|
||||
tok->f.kind = T_RAW_UTF32_STRING_LITERAL;
|
||||
else if (hint == 'u')
|
||||
tok->f.kind = T_RAW_UTF16_STRING_LITERAL;
|
||||
else if (hint == '8')
|
||||
tok->f.kind = T_RAW_UTF8_STRING_LITERAL;
|
||||
else
|
||||
tok->f.kind = T_RAW_STRING_LITERAL;
|
||||
}
|
||||
|
||||
void Lexer::scanCharLiteral(Token *tok, unsigned char hint)
|
||||
{
|
||||
scanUntilQuote(tok, '\'');
|
||||
|
||||
1
src/libs/3rdparty/cplusplus/Lexer.h
vendored
1
src/libs/3rdparty/cplusplus/Lexer.h
vendored
@@ -91,6 +91,7 @@ private:
|
||||
static int classifyOperator(const char *string, int length);
|
||||
|
||||
void scanStringLiteral(Token *tok, unsigned char hint = 0);
|
||||
void scanRawStringLiteral(Token *tok, unsigned char hint = 0);
|
||||
void scanCharLiteral(Token *tok, unsigned char hint = 0);
|
||||
void scanUntilQuote(Token *tok, unsigned char quote);
|
||||
void scanNumericLiteral(Token *tok);
|
||||
|
||||
21
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
21
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
@@ -44,12 +44,10 @@ using namespace CPlusPlus;
|
||||
namespace {
|
||||
|
||||
class DebugRule {
|
||||
const char *name;
|
||||
static int depth;
|
||||
|
||||
public:
|
||||
DebugRule(const char *name, const char *spell, unsigned idx, bool blocked)
|
||||
: name(name)
|
||||
{
|
||||
for (int i = 0; i <= depth; ++i)
|
||||
fputc('-', stderr);
|
||||
@@ -2878,7 +2876,12 @@ bool Parser::parseStringLiteral(ExpressionAST *&node)
|
||||
|| LA() == T_WIDE_STRING_LITERAL
|
||||
|| LA() == T_UTF8_STRING_LITERAL
|
||||
|| LA() == T_UTF16_STRING_LITERAL
|
||||
|| LA() == T_UTF32_STRING_LITERAL)) {
|
||||
|| LA() == T_UTF32_STRING_LITERAL
|
||||
|| LA() == T_RAW_STRING_LITERAL
|
||||
|| LA() == T_RAW_WIDE_STRING_LITERAL
|
||||
|| LA() == T_RAW_UTF8_STRING_LITERAL
|
||||
|| LA() == T_RAW_UTF16_STRING_LITERAL
|
||||
|| LA() == T_RAW_UTF32_STRING_LITERAL)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2888,7 +2891,12 @@ bool Parser::parseStringLiteral(ExpressionAST *&node)
|
||||
|| LA() == T_WIDE_STRING_LITERAL
|
||||
|| LA() == T_UTF8_STRING_LITERAL
|
||||
|| LA() == T_UTF16_STRING_LITERAL
|
||||
|| LA() == T_UTF32_STRING_LITERAL) {
|
||||
|| LA() == T_UTF32_STRING_LITERAL
|
||||
|| LA() == T_RAW_STRING_LITERAL
|
||||
|| LA() == T_RAW_WIDE_STRING_LITERAL
|
||||
|| LA() == T_RAW_UTF8_STRING_LITERAL
|
||||
|| LA() == T_RAW_UTF16_STRING_LITERAL
|
||||
|| LA() == T_RAW_UTF32_STRING_LITERAL) {
|
||||
*ast = new (_pool) StringLiteralAST;
|
||||
(*ast)->literal_token = consumeToken();
|
||||
ast = &(*ast)->next;
|
||||
@@ -4120,6 +4128,11 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
|
||||
case T_UTF8_STRING_LITERAL:
|
||||
case T_UTF16_STRING_LITERAL:
|
||||
case T_UTF32_STRING_LITERAL:
|
||||
case T_RAW_STRING_LITERAL:
|
||||
case T_RAW_WIDE_STRING_LITERAL:
|
||||
case T_RAW_UTF8_STRING_LITERAL:
|
||||
case T_RAW_UTF16_STRING_LITERAL:
|
||||
case T_RAW_UTF32_STRING_LITERAL:
|
||||
return parseStringLiteral(node);
|
||||
|
||||
case T_NULLPTR:
|
||||
|
||||
7
src/libs/3rdparty/cplusplus/Token.cpp
vendored
7
src/libs/3rdparty/cplusplus/Token.cpp
vendored
@@ -35,6 +35,8 @@ static const char *token_names[] = {
|
||||
("<char literal>"), ("<wide char literal>"), ("<utf16 char literal>"), ("<utf32 char literal>"),
|
||||
("<string literal>"), ("<wide string literal>"), ("<utf8 string literal>"),
|
||||
("<utf16 string literal>"), ("<utf32 string literal>"),
|
||||
("<raw string literal>"), ("<raw wide string literal>"), ("<raw utf8 string literal>"),
|
||||
("<raw utf16 string literal>"), ("<raw utf32 string literal>"),
|
||||
("<@string literal>"), ("<angle string literal>"),
|
||||
|
||||
("&"), ("&&"), ("&="), ("->"), ("->*"), ("^"), ("^="), (":"), ("::"),
|
||||
@@ -105,6 +107,11 @@ const char *Token::spell() const
|
||||
case T_UTF8_STRING_LITERAL:
|
||||
case T_UTF16_STRING_LITERAL:
|
||||
case T_UTF32_STRING_LITERAL:
|
||||
case T_RAW_STRING_LITERAL:
|
||||
case T_RAW_WIDE_STRING_LITERAL:
|
||||
case T_RAW_UTF8_STRING_LITERAL:
|
||||
case T_RAW_UTF16_STRING_LITERAL:
|
||||
case T_RAW_UTF32_STRING_LITERAL:
|
||||
case T_AT_STRING_LITERAL:
|
||||
case T_ANGLE_STRING_LITERAL:
|
||||
return literal->chars();
|
||||
|
||||
5
src/libs/3rdparty/cplusplus/Token.h
vendored
5
src/libs/3rdparty/cplusplus/Token.h
vendored
@@ -49,6 +49,11 @@ enum Kind {
|
||||
T_UTF8_STRING_LITERAL,
|
||||
T_UTF16_STRING_LITERAL,
|
||||
T_UTF32_STRING_LITERAL,
|
||||
T_RAW_STRING_LITERAL,
|
||||
T_RAW_WIDE_STRING_LITERAL,
|
||||
T_RAW_UTF8_STRING_LITERAL,
|
||||
T_RAW_UTF16_STRING_LITERAL,
|
||||
T_RAW_UTF32_STRING_LITERAL,
|
||||
T_AT_STRING_LITERAL,
|
||||
T_ANGLE_STRING_LITERAL,
|
||||
T_LAST_STRING_LITERAL = T_ANGLE_STRING_LITERAL,
|
||||
|
||||
Reference in New Issue
Block a user