parent
156323c95e
commit
974e34490f
|
@ -1712,8 +1712,11 @@ void Tokenizer::simplifyTypedef()
|
||||||
tok2 = tok2->linkAt(1);
|
tok2 = tok2->linkAt(1);
|
||||||
|
|
||||||
// skip over const/noexcept
|
// skip over const/noexcept
|
||||||
while (Token::Match(tok2->next(), "const|noexcept"))
|
while (Token::Match(tok2->next(), "const|noexcept")) {
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
|
if (Token::Match(tok2->next(), "( true|false )"))
|
||||||
|
tok2 = tok2->tokAt(3);
|
||||||
|
}
|
||||||
|
|
||||||
tok2->insertToken(")");
|
tok2->insertToken(")");
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
|
@ -6431,11 +6434,15 @@ void Tokenizer::simplifyVarDecl(Token * tokBegin, const Token * const tokEnd, co
|
||||||
tok2 = nullptr;
|
tok2 = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// parenthesis, functions can't be declared like:
|
// function declaration
|
||||||
// int f1(a,b), f2(c,d);
|
else if (Token::Match(varName, "%name% (")) {
|
||||||
// so if there is a comma assume this is a variable declaration
|
Token* commaTok = varName->linkAt(1)->next();
|
||||||
else if (Token::Match(varName, "%name% (") && Token::simpleMatch(varName->linkAt(1), ") ,")) {
|
while (Token::Match(commaTok, "const|noexcept|override|final")) {
|
||||||
tok2 = varName->linkAt(1)->next();
|
commaTok = commaTok->next();
|
||||||
|
if (Token::Match(commaTok, "( true|false )"))
|
||||||
|
commaTok = commaTok->link()->next();
|
||||||
|
}
|
||||||
|
tok2 = Token::simpleMatch(commaTok, ",") ? commaTok : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
|
@ -8424,10 +8431,12 @@ void Tokenizer::simplifyKeyword()
|
||||||
|
|
||||||
// noexcept -> noexcept(true)
|
// noexcept -> noexcept(true)
|
||||||
// 2) void f() noexcept; -> void f() noexcept(true);
|
// 2) void f() noexcept; -> void f() noexcept(true);
|
||||||
else if (Token::Match(tok, ") noexcept :|{|;|const|override|final")) {
|
else if (Token::Match(tok, ") const|override|final| noexcept :|{|;|,|const|override|final")) {
|
||||||
// Insertion is done in inverse order
|
// Insertion is done in inverse order
|
||||||
// The brackets are linked together accordingly afterwards
|
// The brackets are linked together accordingly afterwards
|
||||||
Token* tokNoExcept = tok->next();
|
Token* tokNoExcept = tok->next();
|
||||||
|
while (tokNoExcept->str() != "noexcept")
|
||||||
|
tokNoExcept = tokNoExcept->next();
|
||||||
tokNoExcept->insertToken(")");
|
tokNoExcept->insertToken(")");
|
||||||
Token * braceEnd = tokNoExcept->next();
|
Token * braceEnd = tokNoExcept->next();
|
||||||
tokNoExcept->insertToken("true");
|
tokNoExcept->insertToken("true");
|
||||||
|
|
|
@ -2622,7 +2622,7 @@ private:
|
||||||
" constexpr const foo &c_str() const noexcept { return _a; }\n"
|
" constexpr const foo &c_str() const noexcept { return _a; }\n"
|
||||||
"};";
|
"};";
|
||||||
|
|
||||||
const char exp[] = "class c { char _a [ 4 ] ; const constexpr char ( & c_str ( ) const noexcept ) [ 4 ] { return _a ; } } ;";
|
const char exp[] = "class c { char _a [ 4 ] ; const constexpr char ( & c_str ( ) const noexcept ( true ) ) [ 4 ] { return _a ; } } ;";
|
||||||
ASSERT_EQUALS(exp, tok(code, false));
|
ASSERT_EQUALS(exp, tok(code, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2633,8 +2633,8 @@ private:
|
||||||
" constexpr operator foo &() const noexcept { return _a; }\n"
|
" constexpr operator foo &() const noexcept { return _a; }\n"
|
||||||
"};";
|
"};";
|
||||||
|
|
||||||
const char actual[] = "class c { char _a [ 4 ] ; constexpr operatorchar ( & ( ) const noexcept ) [ 4 ] { return _a ; } } ;";
|
const char actual[] = "class c { char _a [ 4 ] ; constexpr operatorchar ( & ( ) const noexcept ( true ) ) [ 4 ] { return _a ; } } ;";
|
||||||
const char exp[] = "class c { char _a [ 4 ] ; const operator char ( & ( ) const noexcept ) [ 4 ] { return _a ; } } ;";
|
const char exp[] = "class c { char _a [ 4 ] ; const operator char ( & ( ) const noexcept ( true ) ) [ 4 ] { return _a ; } } ;";
|
||||||
TODO_ASSERT_EQUALS(exp, actual, tok(code, false));
|
TODO_ASSERT_EQUALS(exp, actual, tok(code, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2645,8 +2645,8 @@ private:
|
||||||
" constexpr operator const foo &() const noexcept { return _a; }\n"
|
" constexpr operator const foo &() const noexcept { return _a; }\n"
|
||||||
"};";
|
"};";
|
||||||
|
|
||||||
const char actual[] = "class c { char _a [ 4 ] ; constexpr operatorconstchar ( & ( ) const noexcept ) [ 4 ] { return _a ; } } ;";
|
const char actual[] = "class c { char _a [ 4 ] ; constexpr operatorconstchar ( & ( ) const noexcept ( true ) ) [ 4 ] { return _a ; } } ;";
|
||||||
const char exp[] = "class c { char _a [ 4 ] ; const operator const char ( & ( ) const noexcept ) [ 4 ] { return _a ; } } ;";
|
const char exp[] = "class c { char _a [ 4 ] ; const operator const char ( & ( ) const noexcept ( true ) ) [ 4 ] { return _a ; } } ;";
|
||||||
TODO_ASSERT_EQUALS(exp, actual, tok(code, false));
|
TODO_ASSERT_EQUALS(exp, actual, tok(code, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4370,7 +4370,7 @@ private:
|
||||||
"struct Foo : Bar {\n"
|
"struct Foo : Bar {\n"
|
||||||
" virtual std::string get_endpoint_url() const noexcept override final;\n"
|
" virtual std::string get_endpoint_url() const noexcept override final;\n"
|
||||||
"};");
|
"};");
|
||||||
const Token *f = db ? Token::findsimplematch(tokenizer.tokens(), "get_endpoint_url ( ) const noexcept ;") : nullptr;
|
const Token *f = db ? Token::findsimplematch(tokenizer.tokens(), "get_endpoint_url ( ) const noexcept ( true ) ;") : nullptr;
|
||||||
ASSERT(f != nullptr);
|
ASSERT(f != nullptr);
|
||||||
ASSERT(f && f->function() && f->function()->token->linenr() == 2);
|
ASSERT(f && f->function() && f->function()->token->linenr() == 2);
|
||||||
ASSERT(f && f->function() && f->function()->hasVirtualSpecifier());
|
ASSERT(f && f->function() && f->function()->hasVirtualSpecifier());
|
||||||
|
@ -4378,7 +4378,7 @@ private:
|
||||||
ASSERT(f && f->function() && !f->function()->hasFinalSpecifier());
|
ASSERT(f && f->function() && !f->function()->hasFinalSpecifier());
|
||||||
ASSERT(f && f->function() && f->function()->isConst());
|
ASSERT(f && f->function() && f->function()->isConst());
|
||||||
ASSERT(f && f->function() && f->function()->isNoExcept());
|
ASSERT(f && f->function() && f->function()->isNoExcept());
|
||||||
f = db ? Token::findsimplematch(tokenizer.tokens(), "get_endpoint_url ( ) const noexcept override final ;") : nullptr;
|
f = db ? Token::findsimplematch(tokenizer.tokens(), "get_endpoint_url ( ) const noexcept ( true ) override final ;") : nullptr;
|
||||||
ASSERT(f != nullptr);
|
ASSERT(f != nullptr);
|
||||||
ASSERT(f && f->function() && f->function()->token->linenr() == 5);
|
ASSERT(f && f->function() && f->function()->token->linenr() == 5);
|
||||||
ASSERT(f && f->function() && f->function()->hasVirtualSpecifier());
|
ASSERT(f && f->function() && f->function()->hasVirtualSpecifier());
|
||||||
|
@ -6731,7 +6731,7 @@ private:
|
||||||
" return nullptr;\n"
|
" return nullptr;\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
const Token *functok = Token::findsimplematch(tokenizer.tokens(), "what ( ) const noexcept {");
|
const Token *functok = Token::findsimplematch(tokenizer.tokens(), "what ( ) const noexcept ( true ) {");
|
||||||
ASSERT(functok);
|
ASSERT(functok);
|
||||||
ASSERT(functok->function());
|
ASSERT(functok->function());
|
||||||
ASSERT(functok->function()->name() == "what");
|
ASSERT(functok->function()->name() == "what");
|
||||||
|
|
|
@ -217,6 +217,7 @@ private:
|
||||||
TEST_CASE(vardecl26); // #5907 - incorrect handling of extern declarations
|
TEST_CASE(vardecl26); // #5907 - incorrect handling of extern declarations
|
||||||
TEST_CASE(vardecl27); // #7850 - crash on valid C code
|
TEST_CASE(vardecl27); // #7850 - crash on valid C code
|
||||||
TEST_CASE(vardecl28);
|
TEST_CASE(vardecl28);
|
||||||
|
TEST_CASE(vardecl29); // #9282
|
||||||
TEST_CASE(vardecl_stl_1);
|
TEST_CASE(vardecl_stl_1);
|
||||||
TEST_CASE(vardecl_stl_2);
|
TEST_CASE(vardecl_stl_2);
|
||||||
TEST_CASE(vardecl_stl_3);
|
TEST_CASE(vardecl_stl_3);
|
||||||
|
@ -2492,6 +2493,20 @@ private:
|
||||||
tokenizeAndStringify(code, /*expand=*/ true, Settings::Native, "test.c"));
|
tokenizeAndStringify(code, /*expand=*/ true, Settings::Native, "test.c"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vardecl29() { // #9282
|
||||||
|
const char* code = "double f1() noexcept, f2(double) noexcept;";
|
||||||
|
ASSERT_EQUALS("double f1 ( ) noexcept ( true ) ; double f2 ( double ) noexcept ( true ) ;",
|
||||||
|
tokenizeAndStringify(code));
|
||||||
|
|
||||||
|
code = "class C {\n"
|
||||||
|
" double f1() const noexcept, f2 (double) const noexcept;\n"
|
||||||
|
"};\n";
|
||||||
|
ASSERT_EQUALS("class C {\n"
|
||||||
|
"double f1 ( ) const noexcept ( true ) ; double f2 ( double ) const noexcept ( true ) ;\n"
|
||||||
|
"} ;",
|
||||||
|
tokenizeAndStringify(code));
|
||||||
|
}
|
||||||
|
|
||||||
void volatile_variables() {
|
void volatile_variables() {
|
||||||
{
|
{
|
||||||
const char code[] = "volatile int a=0;\n"
|
const char code[] = "volatile int a=0;\n"
|
||||||
|
@ -4931,7 +4946,7 @@ private:
|
||||||
ASSERT_EQUALS(result3, tokenizeAndStringify(code3));
|
ASSERT_EQUALS(result3, tokenizeAndStringify(code3));
|
||||||
|
|
||||||
const char code4[] = "value_type * operator += (int) const noexcept ;";
|
const char code4[] = "value_type * operator += (int) const noexcept ;";
|
||||||
const char result4[] = "value_type * operator+= ( int ) const noexcept ;";
|
const char result4[] = "value_type * operator+= ( int ) const noexcept ( true ) ;";
|
||||||
ASSERT_EQUALS(result4, tokenizeAndStringify(code4));
|
ASSERT_EQUALS(result4, tokenizeAndStringify(code4));
|
||||||
|
|
||||||
const char code5[] = "value_type * operator += (int) const noexcept ( true ) ;";
|
const char code5[] = "value_type * operator += (int) const noexcept ( true ) ;";
|
||||||
|
|
|
@ -47,6 +47,7 @@ private:
|
||||||
TEST_CASE(test4);
|
TEST_CASE(test4);
|
||||||
TEST_CASE(test5);
|
TEST_CASE(test5);
|
||||||
TEST_CASE(test6); // ticket #2602
|
TEST_CASE(test6); // ticket #2602
|
||||||
|
TEST_CASE(test7); // ticket #9282
|
||||||
|
|
||||||
// [ 2236547 ] False positive --style unused function, called via pointer
|
// [ 2236547 ] False positive --style unused function, called via pointer
|
||||||
TEST_CASE(func_pointer1);
|
TEST_CASE(func_pointer1);
|
||||||
|
@ -251,6 +252,16 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test7() { // ticket #9282
|
||||||
|
check("class C {\n"
|
||||||
|
" double f1() const noexcept, f2(double) const noexcept;\n"
|
||||||
|
" void f3() const noexcept;\n"
|
||||||
|
"};\n"
|
||||||
|
"double C::f1() const noexcept { f3(); }\n"
|
||||||
|
"void C::f3() const noexcept {}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue