Fixed #5497: Support designated initializers in array size detection
This commit is contained in:
parent
ec826a0e0e
commit
5dc45bd4ac
|
@ -2069,9 +2069,17 @@ void Tokenizer::arraySize()
|
|||
tok = tok->next();
|
||||
Token *end = tok->linkAt(3);
|
||||
for (Token *tok2 = tok->tokAt(4); tok2 && tok2 != end; tok2 = tok2->next()) {
|
||||
if (Token::Match(tok2, "{|(|["))
|
||||
if (tok2->link() && Token::Match(tok2, "{|(|[|<")) {
|
||||
if (tok2->str() == "[" && tok2->link()->strAt(1) == "=") { // designated initializer
|
||||
if (Token::Match(tok2, "[ %num% ]"))
|
||||
sz = std::max(sz, (unsigned int)MathLib::toULongNumber(tok2->strAt(1)) + 1U);
|
||||
else {
|
||||
sz = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tok2 = tok2->link();
|
||||
else if (tok2->str() == "<") { // Bailout. TODO: When link() supports <>, this bailout becomes unnecessary
|
||||
} else if (tok2->str() == "<") { // Bailout. TODO: When link() supports <>, this bailout becomes unnecessary
|
||||
sz = 0;
|
||||
break;
|
||||
} else if (tok2->str() == ",") {
|
||||
|
|
|
@ -5251,6 +5251,9 @@ private:
|
|||
ASSERT_EQUALS("; int a[2]={ b> c?1:2,3};", arraySize_(";int a[]={ b>c?1:2,3};"));
|
||||
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}}"));
|
||||
ASSERT_EQUALS("; int a[3]={ ABC,2,3};", arraySize_(";int a[]={ABC,2,3};"));
|
||||
ASSERT_EQUALS("; int a[3]={[2]=5};", arraySize_(";int a[]={ [2] = 5 };"));
|
||||
ASSERT_EQUALS("; int a[5]={1,2,[2]=5,3,4};", arraySize_(";int a[]={ 1, 2, [2] = 5, 3, 4 };"));
|
||||
ASSERT_EQUALS("; int a[]={1,2,[ x]=5,3,4};", arraySize_(";int a[]={ 1, 2, [x] = 5, 3, 4 };"));
|
||||
}
|
||||
|
||||
std::string labels_(const std::string &code) {
|
||||
|
|
Loading…
Reference in New Issue