diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 75f28fc62..567773cb5 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7912,12 +7912,17 @@ void Tokenizer::simplifyComma() if (!tok) syntaxError(nullptr); // invalid code like in #4195 - if (Token::Match(tok, "(|[") || - (tok->str() == "{" && tok->previous() && tok->previous()->str() == "=")) { + + if (Token::Match(tok, "(|[") || Token::Match(tok->previous(), "%name%|= {")) { tok = tok->link(); continue; } + if (Token::simpleMatch(tok, "= (") && Token::simpleMatch(tok->linkAt(1), ") {")) { + tok = tok->linkAt(1)->linkAt(1); + continue; + } + // Skip unhandled template specifiers.. if (tok->link() && tok->str() == "<") tok = tok->link(); diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index d79dd89c2..fd5691ab9 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -1966,6 +1966,12 @@ private: "}"; ASSERT_EQUALS(expected, tok(code)); } + + { + const char code[] = "tr = (struct reg){ .a = (1), .c = (2) };"; + const char expected[] = "tr = ( struct reg ) { . a = 1 , . c = 2 } ;"; + ASSERT_EQUALS(expected, tok(code)); + } } void simplifyConditionOperator() {