From cd6332d960375f2290f224b1c58e79561e268df9 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Sat, 26 Apr 2014 18:30:09 +0200 Subject: [PATCH] Tokenizer: replace ') const| {' pattern to detect function start --- lib/tokenize.cpp | 20 ++++++++++++++++++-- test/testtokenize.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 51a1679b1..3ade24267 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -10025,6 +10025,22 @@ void Tokenizer::deleteSymbolDatabase() _symbolDatabase = 0; } +static bool operatorEnd(const Token * tok) +{ + if (Token::Match(tok, ") const|volatile| noexcept| [=;{),]")) + return true; + + if (Token::Match(tok, ") const|volatile| noexcept|throw (")) { + int offset = 2; + if (tok->strAt(1) == "const" || tok->strAt(1) == "volatile") + ++offset; + if (Token::Match(tok->linkAt(offset), ") [=;{),]")) + return true; + } + + return false; +} + void Tokenizer::simplifyOperatorName() { if (isC()) @@ -10060,7 +10076,7 @@ void Tokenizer::simplifyOperatorName() } if (Token::Match(par, "( *| )")) { // break out and simplify.. - if (Token::Match(par, "( ) const| [=;{),]")) + if (operatorEnd(par->next())) break; while (par->str() != ")") { @@ -10073,7 +10089,7 @@ void Tokenizer::simplifyOperatorName() } } - if (par && Token::Match(par->link(), ") const| [=;{),]")) { + if (par && operatorEnd(par->link())) { tok->str("operator" + op); Token::eraseTokens(tok, par); } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 217abb5cb..f46392236 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -504,6 +504,7 @@ private: TEST_CASE(simplifyOperatorName5); TEST_CASE(simplifyOperatorName6); // ticket #3194 TEST_CASE(simplifyOperatorName7); // ticket #4619 + TEST_CASE(simplifyOperatorName8); // ticket #5706 TEST_CASE(simplifyNull); @@ -8128,6 +8129,32 @@ private: ASSERT_EQUALS(result1, tokenizeAndStringify(code1,false)); } + void simplifyOperatorName8() { // ticket #5706 + const char code1[] = "value_type * operator += (int) noexcept ;"; + const char result1[] = "value_type * operator+= ( int ) noexcept ;"; + ASSERT_EQUALS(result1, tokenizeAndStringify(code1,false)); + + const char code2[] = "value_type * operator += (int) noexcept ( true ) ;"; + const char result2[] = "value_type * operator+= ( int ) noexcept ( true ) ;"; + ASSERT_EQUALS(result2, tokenizeAndStringify(code2,false)); + + const char code3[] = "value_type * operator += (int) throw ( ) ;"; + const char result3[] = "value_type * operator+= ( int ) throw ( ) ;"; + ASSERT_EQUALS(result3, tokenizeAndStringify(code3,false)); + + const char code4[] = "value_type * operator += (int) const noexcept ;"; + const char result4[] = "value_type * operator+= ( int ) const noexcept ;"; + ASSERT_EQUALS(result4, tokenizeAndStringify(code4,false)); + + const char code5[] = "value_type * operator += (int) const noexcept ( true ) ;"; + const char result5[] = "value_type * operator+= ( int ) const noexcept ( true ) ;"; + ASSERT_EQUALS(result5, tokenizeAndStringify(code5,false)); + + const char code6[] = "value_type * operator += (int) const throw ( ) ;"; + const char result6[] = "value_type * operator+= ( int ) const throw ( ) ;"; + ASSERT_EQUALS(result6, tokenizeAndStringify(code6,false)); + } + void simplifyNull() { ASSERT_EQUALS("if ( ! p )", tokenizeAndStringify("if (p==NULL)")); ASSERT_EQUALS("f ( NULL ) ;", tokenizeAndStringify("f(NULL);"));