From 4c406648615ec5814ad764d286191f55f41c6e3a Mon Sep 17 00:00:00 2001 From: PKEuS Date: Mon, 13 Apr 2015 19:32:28 +0200 Subject: [PATCH] Fixed #6639: Calculate sizeof() of multidimensional arrays --- lib/tokenize.cpp | 14 +++++++++++--- test/testsimplifytokens.cpp | 5 +++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index c93589a7a..0b8cbac3c 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3018,12 +3018,20 @@ bool Tokenizer::simplifySizeof() else if (Token::Match(tok->previous(), "%type% %name% [ %num% ] [[;=]") || Token::Match(tok->tokAt(-2), "%type% * %name% [ %num% ] [[;=]")) { - const unsigned int size = sizeOfType(tok->previous()); + unsigned int size = sizeOfType(tok->previous()); if (size == 0) continue; - sizeOfVar[varId] = size * static_cast(MathLib::toLongNumber(tok->strAt(2))); - declTokOfVar[varId] = tok; + Token* tok2 = tok->next(); + while (Token::Match(tok2, "[ %num% ]")) { + size *= static_cast(MathLib::toLongNumber(tok2->strAt(1))); + tok2 = tok2->tokAt(3); + } + if (Token::Match(tok2, "[;=]")) { + sizeOfVar[varId] = size; + declTokOfVar[varId] = tok; + } + tok = tok2; } else if (Token::Match(tok->previous(), "%type% %name% [ %num% ] [,)]") || diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 6fdaacc30..382c48b1a 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -893,8 +893,9 @@ private: } code = "char i[2][20];\n" - "sizeof(i[1]);"; - ASSERT_EQUALS("char i [ 2 ] [ 20 ] ; 20 ;", tok(code)); + "sizeof(i[1]);\n" + "sizeof(i);"; + ASSERT_EQUALS("char i [ 2 ] [ 20 ] ; 20 ; 40 ;", tok(code)); } void sizeof5() {