Skip to content

Commit 5dc45bd

Browse files
committed
Fixed danmar#5497: Support designated initializers in array size detection
1 parent ec826a0 commit 5dc45bd

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

lib/tokenize.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2069,9 +2069,17 @@ void Tokenizer::arraySize()
20692069
tok = tok->next();
20702070
Token *end = tok->linkAt(3);
20712071
for (Token *tok2 = tok->tokAt(4); tok2 && tok2 != end; tok2 = tok2->next()) {
2072-
if (Token::Match(tok2, "{|(|["))
2072+
if (tok2->link() && Token::Match(tok2, "{|(|[|<")) {
2073+
if (tok2->str() == "[" && tok2->link()->strAt(1) == "=") { // designated initializer
2074+
if (Token::Match(tok2, "[ %num% ]"))
2075+
sz = std::max(sz, (unsigned int)MathLib::toULongNumber(tok2->strAt(1)) + 1U);
2076+
else {
2077+
sz = 0;
2078+
break;
2079+
}
2080+
}
20732081
tok2 = tok2->link();
2074-
else if (tok2->str() == "<") { // Bailout. TODO: When link() supports <>, this bailout becomes unnecessary
2082+
} else if (tok2->str() == "<") { // Bailout. TODO: When link() supports <>, this bailout becomes unnecessary
20752083
sz = 0;
20762084
break;
20772085
} else if (tok2->str() == ",") {

test/testtokenize.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5251,6 +5251,9 @@ class TestTokenizer : public TestFixture {
52515251
ASSERT_EQUALS("; int a[2]={ b> c?1:2,3};", arraySize_(";int a[]={ b>c?1:2,3};"));
52525252
TODO_ASSERT_EQUALS("int main(){ int a[2]={ b< c?1:2,3}}", "int main(){ int a[]={ b< c?1:2,3}}", arraySize_("int main(){int a[]={b<c?1:2,3}}"));
52535253
ASSERT_EQUALS("; int a[3]={ ABC,2,3};", arraySize_(";int a[]={ABC,2,3};"));
5254+
ASSERT_EQUALS("; int a[3]={[2]=5};", arraySize_(";int a[]={ [2] = 5 };"));
5255+
ASSERT_EQUALS("; int a[5]={1,2,[2]=5,3,4};", arraySize_(";int a[]={ 1, 2, [2] = 5, 3, 4 };"));
5256+
ASSERT_EQUALS("; int a[]={1,2,[ x]=5,3,4};", arraySize_(";int a[]={ 1, 2, [x] = 5, 3, 4 };"));
52545257
}
52555258

52565259
std::string labels_(const std::string &code) {

0 commit comments

Comments
 (0)