forked from qt-creator/qt-creator
C++: fix trigraph parsing in macros.
Trigraphs must only be parsed before/during preprocessing. The preprocessor will now replace trigraphs with their standard form, and re-lexing in TranslationUnit will not try to parse any trigraph. Also added a few missing trigraphs: ??=, ??', ??! and ??-. Task-number: QTCREATORBUG-13253 Change-Id: I1723ed53b00090b878c22b83b7e963b647b65f72 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
@@ -70,6 +70,8 @@ private slots:
|
||||
void literals_data();
|
||||
void preprocessor();
|
||||
void preprocessor_data();
|
||||
void trigraph();
|
||||
void trigraph_data();
|
||||
|
||||
void bytes_and_utf16chars();
|
||||
void bytes_and_utf16chars_data();
|
||||
@@ -263,12 +265,6 @@ void tst_SimpleLexer::basic_data()
|
||||
<< T_INT << T_IDENTIFIER << T_SEMICOLON << T_CPP_DOXY_COMMENT
|
||||
<< T_INT << T_IDENTIFIER << T_SEMICOLON << T_CPP_DOXY_COMMENT << T_CPP_DOXY_COMMENT;
|
||||
QTest::newRow(source) << source << expectedTokenKindList;
|
||||
|
||||
source = "?" "?(?" "?)?" "?<?" "?>a?b:c";
|
||||
expectedTokenKindList = TokenKindList()
|
||||
<< T_LBRACKET << T_RBRACKET << T_LBRACE << T_RBRACE
|
||||
<< T_IDENTIFIER << T_QUESTION << T_IDENTIFIER << T_COLON << T_IDENTIFIER;
|
||||
QTest::newRow(source) << source << expectedTokenKindList;
|
||||
}
|
||||
|
||||
void tst_SimpleLexer::literals()
|
||||
@@ -744,5 +740,43 @@ void tst_SimpleLexer::incremental_data()
|
||||
<< (TokenKindList() << T_IDENTIFIER);
|
||||
}
|
||||
|
||||
void tst_SimpleLexer::trigraph()
|
||||
{
|
||||
QFETCH(QByteArray, source);
|
||||
QFETCH(TokenKindList, expectedTokenKindList);
|
||||
|
||||
run(source, toTokens(expectedTokenKindList), false, CompareKind, true);
|
||||
}
|
||||
|
||||
void tst_SimpleLexer::trigraph_data()
|
||||
{
|
||||
QTest::addColumn<QByteArray>("source");
|
||||
QTest::addColumn<TokenKindList>("expectedTokenKindList");
|
||||
|
||||
QTest::newRow("pound_trigraph") << _("?" "?=") << (TokenKindList() << T_POUND);
|
||||
|
||||
QTest::newRow("caret_trigraph") << _("?" "?'") << (TokenKindList() << T_CARET);
|
||||
|
||||
QTest::newRow("left_bracket_trigraph") << _("?" "?(") << (TokenKindList() << T_LBRACKET);
|
||||
|
||||
QTest::newRow("right_bracket_trigraph") << _("?" "?)") << (TokenKindList() << T_RBRACKET);
|
||||
|
||||
QTest::newRow("pipe_trigraph") << _("?" "?!") << (TokenKindList() << T_PIPE);
|
||||
|
||||
QTest::newRow("left_brace_trigraph") << _("?" "?<") << (TokenKindList() << T_LBRACE);
|
||||
|
||||
QTest::newRow("right_brace_trigraph") << _("?" "?>") << (TokenKindList() << T_RBRACE);
|
||||
|
||||
QTest::newRow("tilde_trigraph") << _("?" "?-") << (TokenKindList() << T_TILDE);
|
||||
|
||||
QTest::newRow("pound_pound_trigraph") << _("?" "?=" "?" "?=") << (TokenKindList() << T_POUND_POUND);
|
||||
|
||||
QTest::newRow("caret_equal_trigraph") << _("?" "?'=") << (TokenKindList() << T_CARET_EQUAL);
|
||||
|
||||
QTest::newRow("pipe_equal_trigraph") << _("?" "?!=") << (TokenKindList() << T_PIPE_EQUAL);
|
||||
|
||||
QTest::newRow("tilde_equal_trigraph") << _("?" "?-=") << (TokenKindList() << T_TILDE_EQUAL);
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_SimpleLexer)
|
||||
#include "tst_lexer.moc"
|
||||
|
||||
Reference in New Issue
Block a user