From 5444875f89123fe9a6cf07360489cf91f7a04db6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 24 May 2017 20:18:31 +0200 Subject: [PATCH] Fixed #8034 (AST: better handling for c++ type initialization) --- lib/tokenlist.cpp | 24 ++++++++++++++++++++++++ test/testtokenize.cpp | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index d4a7c7490..4ad9a9531 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -383,6 +383,26 @@ static bool iscast(const Token *tok) return false; } +// int(1), int*(2), .. +static Token * findCppTypeInitPar(Token *tok) +{ + if (!tok || !Token::Match(tok->previous(), "[,(] %name%")) + return nullptr; + while (Token::Match(tok, "%name%|::|<")) { + if (tok->str() == "<") { + tok = tok->link(); + if (!tok) + return nullptr; + } + tok = tok->next(); + } + if (!Token::Match(tok, "[*&]")) + return nullptr; + while (Token::Match(tok, "[*&]")) + tok = tok->next(); + return (tok && tok->str() == "(") ? tok : nullptr; +} + // X{} X{} etc static bool iscpp11init(const Token * const tok) { @@ -492,6 +512,10 @@ static void compileTerm(Token *&tok, AST_state& state) } else if (Token::Match(tok, "sizeof !!(")) { compileUnaryOp(tok, state, compileExpression); state.op.pop(); + } else if (state.cpp && findCppTypeInitPar(tok)) { // int(0), int*(123), .. + tok = findCppTypeInitPar(tok); + state.op.push(tok); + tok = tok->tokAt(2); } else if (state.cpp && iscpp11init(tok)) { // X{} X{} etc state.op.push(tok); tok = tok->next(); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 2d131a5d6..332dbe5e5 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -7930,6 +7930,10 @@ private: ASSERT_EQUALS("f\"A\"1,(",testAst("f(\"A\" B, 1);")); ASSERT_EQUALS("fA1,(",testAst("f(A \"B\", 1);")); + // C++ : type() + ASSERT_EQUALS("fint(0,(", testAst("f(int(),0);")); + ASSERT_EQUALS("f(0,(", testAst("f(int *(),0);")); // typedef int* X; f(X(),0); + // for ASSERT_EQUALS("for;;(", testAst("for(;;)")); ASSERT_EQUALS("fora0=a8