| 21517 | } |
| 21518 | |
| 21519 | void BfExprEvaluator::InitializedSizedArray(BfSizedArrayType* arrayType, BfTokenNode* openToken, const BfSizedArray<BfExpression*>& valueExprs, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, BfTypedValue* receivingValue) |
| 21520 | { |
| 21521 | struct InitValue |
| 21522 | { |
| 21523 | BfTypedValue mValue; |
| 21524 | bool mIsUninitialized; |
| 21525 | bool mIsDefaultInitializer; |
| 21526 | bool mIsDeferred; |
| 21527 | |
| 21528 | InitValue() |
| 21529 | { |
| 21530 | mIsUninitialized = false; |
| 21531 | mIsDefaultInitializer = false; |
| 21532 | mIsDeferred = false; |
| 21533 | } |
| 21534 | }; |
| 21535 | |
| 21536 | SizedArray<InitValue, 8> values; |
| 21537 | |
| 21538 | { |
| 21539 | //bool hasFailed = false; |
| 21540 | HashSet<int> failedAt; |
| 21541 | bool isAllConst = true; |
| 21542 | |
| 21543 | //bool endUninitialzied = false; |
| 21544 | |
| 21545 | int depth = 0; |
| 21546 | |
| 21547 | std::function<void(BfSizedArrayType*, BfTokenNode* openToken, const BfSizedArray<BfExpression*>&, const BfSizedArray<BfTokenNode*>&, BfTokenNode*, bool)> |
| 21548 | _GetValues = [&](BfSizedArrayType* checkArrayType, BfTokenNode* openToken, const BfSizedArray<BfExpression*>& valueExprs, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, bool ignore) |
| 21549 | { |
| 21550 | int64 initCountDiff = (int)valueExprs.size() - checkArrayType->mElementCount; |
| 21551 | if ((initCountDiff != 0) && (!valueExprs.IsEmpty()) && (!failedAt.Contains(depth))) |
| 21552 | { |
| 21553 | if (checkArrayType->mElementCount == -1) |
| 21554 | { |
| 21555 | // mModule->Fail("Initializers not supported for unknown-sized arrays", valueExprs[0]); |
| 21556 | // failedAt.Add(depth); |
| 21557 | } |
| 21558 | else if (initCountDiff > 0) |
| 21559 | { |
| 21560 | mModule->Fail(StrFormat("Too many initializers, expected %d fewer", initCountDiff), valueExprs[BF_MAX((int)checkArrayType->mElementCount, 0)]); |
| 21561 | failedAt.Add(depth); |
| 21562 | } |
| 21563 | else |
| 21564 | { |
| 21565 | // If it ends with ", ?) or ",)" then allow unsized |
| 21566 | if (((valueExprs.size() == 0) || (BfNodeDynCast<BfUninitializedExpression>(valueExprs.back()) == NULL)) && |
| 21567 | ((commas.size() < valueExprs.size()) || (valueExprs.size() == 0))) |
| 21568 | { |
| 21569 | BfAstNode* refNode = closeToken; |
| 21570 | if ((refNode == NULL) && (mModule->mParentNodeEntry != NULL)) |
| 21571 | refNode = mModule->mParentNodeEntry->mNode; |
| 21572 | BF_ASSERT(refNode != NULL); |
| 21573 | mModule->Fail(StrFormat("Too few initializer, expected %d more", -initCountDiff), refNode); |
| 21574 | failedAt.Add(depth); |
| 21575 | } |
| 21576 | } |
nothing calls this directly
no test coverage detected