From e6b5fe99f6b8c179f006e1bfb7af6304b97bd57c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 29 Nov 2009 17:25:35 +0100 Subject: [PATCH] Fixed #1027 (Internal error: sizeof a++) --- lib/tokenize.cpp | 8 ++++++++ test/testsimplifytokens.cpp | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4a7896d83..68aa3adce 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -1737,6 +1737,14 @@ void Tokenizer::simplifySizeof() tok->next()->insertToken("*"); } + // sizeof a++ -> sizeof(a++) + if (Token::Match(tok->next(), "++|-- %var% !!.") || Token::Match(tok->next(), "%var% ++|--")) + { + tok->insertToken("("); + tok->tokAt(3)->insertToken(")"); + Token::createMutualLinks(tok->next(), tok->tokAt(4)); + } + // sizeof int -> sizeof( int ) if (tok->next()->str() != "(") { diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index afcc7a541..6e75f733e 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -71,6 +71,7 @@ private: TEST_CASE(sizeof13); TEST_CASE(sizeof14); TEST_CASE(sizeof15); + TEST_CASE(sizeof16); TEST_CASE(casting); TEST_CASE(strlen1); @@ -925,6 +926,18 @@ private: ASSERT_EQUALS("", errout.str()); } + void sizeof16() + { + // ticket #1027 + const char code[] = "void f()\n" + "{\n" + " int a;\n" + " printf(\"%i\", sizeof a++);\n" + "}\n"; + ASSERT_EQUALS("void f ( ) { int a ; printf ( \"%i\" , sizeof ( a ++ ) ) ; }", tok(code)); + ASSERT_EQUALS("", errout.str()); + } + void casting() { {