From dc7b6ca6c376714dc65d170f693e40263f422739 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 12 Mar 2015 23:15:38 +0100 Subject: [PATCH] C++: fix lexing POUND_POUND token with digraphs. Change-Id: I9204b827c60b283cc4e6b88c810b31eb7587c7db Reviewed-by: Nikolai Kosjar --- src/libs/3rdparty/cplusplus/Lexer.cpp | 10 ++++++-- tests/auto/cplusplus/lexer/tst_lexer.cpp | 32 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/libs/3rdparty/cplusplus/Lexer.cpp b/src/libs/3rdparty/cplusplus/Lexer.cpp index 68f87f126c1..a508ce3d302 100644 --- a/src/libs/3rdparty/cplusplus/Lexer.cpp +++ b/src/libs/3rdparty/cplusplus/Lexer.cpp @@ -263,8 +263,8 @@ void Lexer::scan_helper(Token *tok) case '#': if (_yychar == '#') { - tok->f.kind = T_POUND_POUND; yyinp(); + tok->f.kind = T_POUND_POUND; } else { tok->f.kind = T_POUND; } @@ -515,7 +515,13 @@ void Lexer::scan_helper(Token *tok) tok->f.kind = T_RBRACE; } else if (_yychar == ':') { yyinp(); - tok->f.kind = T_POUND; + if (_yychar == '%' && *(_currentChar + 1) == ':') { + yyinp(); + yyinp(); + tok->f.kind = T_POUND_POUND; + } else { + tok->f.kind = T_POUND; + } } else { tok->f.kind = T_PERCENT; } diff --git a/tests/auto/cplusplus/lexer/tst_lexer.cpp b/tests/auto/cplusplus/lexer/tst_lexer.cpp index 6f32622cfcc..53da805a684 100644 --- a/tests/auto/cplusplus/lexer/tst_lexer.cpp +++ b/tests/auto/cplusplus/lexer/tst_lexer.cpp @@ -70,6 +70,8 @@ private slots: void literals_data(); void preprocessor(); void preprocessor_data(); + void digraph(); + void digraph_data(); void trigraph(); void trigraph_data(); @@ -740,6 +742,36 @@ void tst_SimpleLexer::incremental_data() << (TokenKindList() << T_IDENTIFIER); } +void tst_SimpleLexer::digraph() +{ + QFETCH(QByteArray, source); + QFETCH(TokenKindList, expectedTokenKindList); + + run(source, toTokens(expectedTokenKindList), false, CompareKind); +} + +void tst_SimpleLexer::digraph_data() +{ + QTest::addColumn("source"); + QTest::addColumn("expectedTokenKindList"); + + QTest::newRow("lbracket_digraph") << _("<:") << (TokenKindList() << T_LBRACKET); + + QTest::newRow("rbracket_digraph") << _(":>") << (TokenKindList() << T_RBRACKET); + + QTest::newRow("lbrace_digraph") << _("<%") << (TokenKindList() << T_LBRACE); + + QTest::newRow("rbrace_digraph") << _("%>") << (TokenKindList() << T_RBRACE); + + QTest::newRow("pound_digraph") << _("%:") << (TokenKindList() << T_POUND); + + QTest::newRow("pound_pound_digraph") << _("%:%:") << (TokenKindList() << T_POUND_POUND); + + QTest::newRow("pound_pound_mixed_digraph_1") << _("#%:") << (TokenKindList() << T_POUND << T_POUND); + + QTest::newRow("pound_pound_mixed_digraph_2") << _("%:#") << (TokenKindList() << T_POUND << T_POUND); +} + void tst_SimpleLexer::trigraph() { QFETCH(QByteArray, source);