From 523a9c1c4aa8e7b6a88b519c31548d3e1bc9aa2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 9 Sep 2018 21:11:45 +0200 Subject: [PATCH] Fixed #8746 (Syntax error, AST broken (using a::operator=)) --- lib/tokenize.cpp | 24 ++++++++++++++++++------ test/testtokenize.cpp | 6 ++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 54f2a6938..0bc8624a6 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9765,7 +9765,22 @@ void Tokenizer::simplifyOperatorName() if (isC()) return; + bool isUsingStmt = false; + for (Token *tok = list.front(); tok; tok = tok->next()) { + if (tok->str() == ";") { + if (isUsingStmt && Token::Match(tok->tokAt(-3), "using|:: operator %op% ;")) { + tok->previous()->previous()->str("operator" + tok->previous()->str()); + tok->deletePrevious(); + } + isUsingStmt = false; + continue; + } + if (tok->str() == "using") { + isUsingStmt = true; + continue; + } + if (tok->str() != "operator") continue; // operator op @@ -9783,18 +9798,15 @@ void Tokenizer::simplifyOperatorName() par = par->next(); } done = false; - } - if (Token::Match(par, ".|%op%|,")) { + } else if (Token::Match(par, ".|%op%|,")) { op += par->str(); par = par->next(); done = false; - } - if (Token::simpleMatch(par, "[ ]")) { + } else if (Token::simpleMatch(par, "[ ]")) { op += "[]"; par = par->tokAt(2); done = false; - } - if (Token::Match(par, "( *| )")) { + } else if (Token::Match(par, "( *| )")) { // break out and simplify.. if (operatorEnd(par->next())) break; diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index f945a9546..099fa85a3 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -391,6 +391,7 @@ private: TEST_CASE(simplifyOperatorName7); // ticket #4619 TEST_CASE(simplifyOperatorName8); // ticket #5706 TEST_CASE(simplifyOperatorName9); // ticket #5709 - comma operator not properly tokenized + TEST_CASE(simplifyOperatorName10); // #8746 - using a::operator= TEST_CASE(simplifyNullArray); @@ -6123,6 +6124,11 @@ private: ASSERT_EQUALS(code, tokenizeAndStringify(code)); } + void simplifyOperatorName10() { // #8746 + const char code[] = "using a::operator=;"; + ASSERT_EQUALS("using a :: operator= ;", tokenizeAndStringify(code)); + } + void simplifyNullArray() { ASSERT_EQUALS("* ( foo . bar [ 5 ] ) = x ;", tokenizeAndStringify("0[foo.bar[5]] = x;")); }