diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 19c881e7ba5..d67356ad086 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3774,7 +3774,8 @@ void Tokenizer::concatenateNegativeNumberAndAnyPositive() if (!tok->tokAt(2) || (tok->tokAt(2)->isOp() && !Token::Match(tok->tokAt(2), "[+-*]"))) syntaxError(tok); - while (tok->str() != ">" && tok->next() && tok->strAt(1) == "+" && (!Token::Match(tok->tokAt(2), "%name% (|;") || Token::Match(tok, "%op%"))) + while ((tok->isArithmeticalOp() || tok->isComparisonOp()) && tok->str() != ">" && tok->next() && tok->strAt(1) == "+" && + (!Token::Match(tok->tokAt(2), "%name% (|;") || Token::Match(tok, "%op%"))) tok->deleteNext(); if (Token::Match(tok->next(), "+|- %num%")) { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index dfb61665b8a..cbd9eafb8d3 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -546,6 +546,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(findFunction62); // #14272 - pointer passed to function is const TEST_CASE(findFunction63); // #14937 - member function of type returned by operator() TEST_CASE(findFunction64); // overloaded operator() + TEST_CASE(findFunction65); TEST_CASE(findFunctionRef1); TEST_CASE(findFunctionRef2); // #13328 TEST_CASE(findFunctionContainer); @@ -8990,6 +8991,20 @@ class TestSymbolDatabase : public TestFixture { } } + void findFunction65() + { + { + GET_SYMBOL_DB("bool g(char) { return true; }\n" // #15033 + "bool g(int) { return false; }\n" + "void f(char c) {\n" + " if (g(+c)) {}\n" + "}\n"); + const Token* g = Token::findsimplematch(tokenizer.tokens(), "g ( +"); + ASSERT(g && g->function()); + ASSERT_EQUALS(2, g->function()->tokenDef->linenr()); + } + } + void findFunctionRef1() { GET_SYMBOL_DB("struct X {\n" " const std::vector getInts() const & { return mInts; }\n" diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 7a07516b632..a25ea9c4bd6 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -1104,7 +1104,7 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS("int f ( ) { return -2 ; }", tokenizeAndStringify("int f(){return -2;}\n")); ASSERT_EQUALS("int x [ 2 ] = { -2 , 1 }", tokenizeAndStringify("int x[2] = {-2,1}\n")); - ASSERT_EQUALS("f ( 123 )", tokenizeAndStringify("f(+123)\n")); + ASSERT_EQUALS("f ( +123 )", tokenizeAndStringify("f(+123)\n")); ASSERT_EQUALS("std :: extent_v < A > - 1 ;", tokenizeAndStringify("std::extent_v - 1;\n")); // #11341 } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 618e16624d8..301937718f4 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1837,6 +1837,14 @@ class TestValueFlow : public TestFixture { ASSERT_EQUALS(1U, values.size()); ASSERT_EQUALS(3 * settings.platform.sizeof_int, values.back().intvalue); ASSERT_EQUALS_ENUM(ValueFlow::Value::ValueKind::Known, values.back().valueKind); + + code = "int f(char c) {\n" // #15033 + " return sizeof(+c);\n" + "}\n"; + values = tokenValues(code, "( +"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(settings.platform.sizeof_int, values.back().intvalue); + ASSERT_EQUALS_ENUM(ValueFlow::Value::ValueKind::Known, values.back().valueKind); } void valueFlowComma()