Commit 27deb9c8 authored by Francois Ferrand's avatar Francois Ferrand
Browse files

C++: fix digraph parsing for <:: exception.



According to section 2.5 from the standard:
""" If the input stream has been parsed into preprocessing tokens up to
a given character: ... Otherwise, if the next three characters are <::
and the subsequent character is neither : nor >, the < is treated as a
preprocessor token by itself and not as the first character of the
alternative token <:. """

Change-Id: Ib9cdac61e3c2243d1bc1d4471a09ae6bd839fdda
Task-number: QTCREATORBUG-13253
Reviewed-by: default avatarNikolai Kosjar <nikolai.kosjar@theqtcompany.com>
parent dc7b6ca6
......@@ -610,8 +610,12 @@ void Lexer::scan_helper(Token *tok)
yyinp();
tok->f.kind = T_LESS_EQUAL;
} else if (_yychar == ':') {
yyinp();
tok->f.kind = T_LBRACKET;
if (*(_currentChar+1) != ':' || *(_currentChar+2) == ':' || *(_currentChar+2) == '>') {
yyinp();
tok->f.kind = T_LBRACKET;
} else {
tok->f.kind = T_LESS;
}
} else if (_yychar == '%') {
yyinp();
tok->f.kind = T_LBRACE;
......
......@@ -770,6 +770,14 @@ void tst_SimpleLexer::digraph_data()
QTest::newRow("pound_pound_mixed_digraph_1") << _("#%:") << (TokenKindList() << T_POUND << T_POUND);
QTest::newRow("pound_pound_mixed_digraph_2") << _("%:#") << (TokenKindList() << T_POUND << T_POUND);
QTest::newRow("lbracket_digraph_exception1") << _("<::") << (TokenKindList() << T_LESS << T_COLON_COLON);
QTest::newRow("lbracket_digraph_exception2") << _("<::x") << (TokenKindList() << T_LESS << T_COLON_COLON << T_IDENTIFIER);
QTest::newRow("lbracket_digraph_exception3") << _("<:::") << (TokenKindList() << T_LBRACKET << T_COLON_COLON);
QTest::newRow("lbracket_digraph_exception4") << _("<::>") << (TokenKindList() << T_LBRACKET << T_RBRACKET);
}
void tst_SimpleLexer::trigraph()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment