diff --git a/lib/check64bit.cpp b/lib/check64bit.cpp index 03a825cce..221aea0eb 100644 --- a/lib/check64bit.cpp +++ b/lib/check64bit.cpp @@ -96,18 +96,23 @@ void Check64BitPortability::pointerassignment() for (std::size_t i = 0; i < functions; ++i) { const Scope * scope = symbolDatabase->functionScopes[i]; for (const Token *tok = scope->classStart; tok && tok != scope->classEnd; tok = tok->next()) { - if (Token::Match(tok, "[;{}] %var% = %var% [;+]")) { + if (Token::Match(tok, "[;{}] %var% = %var%")) { + const Token* tok2 = tok->tokAt(3); + while (Token::Match(tok2->next(), ".|::")) + tok2 = tok2->tokAt(2); + if (!Token::Match(tok2, "%var% ;|+")) + continue; const Variable *var1(tok->next()->variable()); - const Variable *var2(tok->tokAt(3)->variable()); + const Variable *var2(tok2->variable()); - if (isaddr(var1) && isint(var2) && tok->strAt(4) != "+") + if (isaddr(var1) && isint(var2) && tok2->strAt(1) != "+") assignmentIntegerToAddressError(tok->next()); - else if (isint(var1) && isaddr(var2) && !tok->tokAt(3)->isPointerCompare()) { + else if (isint(var1) && isaddr(var2) && !tok2->isPointerCompare()) { // assigning address => warning // some trivial addition => warning - if (Token::Match(tok->tokAt(4), "+ %any% !!;")) + if (Token::Match(tok2->next(), "+ %any% !!;")) continue; assignmentAddressToIntegerError(tok->next()); diff --git a/test/test64bit.cpp b/test/test64bit.cpp index 94280913d..3913349fd 100644 --- a/test/test64bit.cpp +++ b/test/test64bit.cpp @@ -103,11 +103,11 @@ private: } void structmember() { - check("struct Foo { int *p };\n" + check("struct Foo { int *p; };\n" "void f(struct Foo *foo) {\n" " int i = foo->p;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", "", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", errout.str()); } void ptrcompare() {