@@ -270,7 +270,7 @@ newtype TTranslatedElement =
270270 not ignoreExpr ( initList ) and
271271 isFirstValueInitializedElementInRange ( initList , elementIndex ) and
272272 elementCount =
273- getNextExplicitlyInitializedElementAfter ( initList , elementIndex ) -
273+ getEndOfValueInitializedRange ( initList , elementIndex ) -
274274 elementIndex
275275 } or
276276 // The initialization of a base class from within a constructor.
@@ -322,23 +322,30 @@ newtype TTranslatedElement =
322322
323323/**
324324 * Gets the index of the first explicitly initialized element in `initList`
325- * whose index is greater than `afterElementIndex`. If there are no remaining
326- * explicitly initialized elements in `initList`, the result is the total number
327- * of elements in the array being initialized.
325+ * whose index is greater than `afterElementIndex`, where `afterElementIndex`
326+ * is a first value-initialized element in a value-initialized range in
327+ * `initList`. If there are no remaining explicitly initialized elements in
328+ * `initList`, the result is the total number of elements in the array being
329+ * initialized.
328330 */
329- private int getNextExplicitlyInitializedElementAfter (
330- ArrayAggregateLiteral initList , int afterElementIndex ) {
331- if exists ( int x |
332- x > afterElementIndex and
333- exists ( initList .getElementExpr ( x ) ) )
334- then (
335- if exists ( initList .getElementExpr ( afterElementIndex + 1 ) )
336- then result = afterElementIndex + 1
337- else result = getNextExplicitlyInitializedElementAfter ( initList , afterElementIndex + 1 ) )
338- else
339- result = initList .getType ( ) .getUnspecifiedType ( ) .( ArrayType ) .getArraySize ( ) and
340- // required for binding
341- initList .isInitialized ( afterElementIndex )
331+ private int getEndOfValueInitializedRange ( ArrayAggregateLiteral initList , int afterElementIndex ) {
332+ result = getNextExplicitlyInitializedElementAfter ( initList , afterElementIndex )
333+ or
334+ isFirstValueInitializedElementInRange ( initList , afterElementIndex ) and
335+ not exists ( getNextExplicitlyInitializedElementAfter ( initList , afterElementIndex ) ) and
336+ result = initList .getType ( ) .getUnspecifiedType ( ) .( ArrayType ) .getArraySize ( )
337+ }
338+
339+ /**
340+ * Gets the index of the first explicitly initialized element in `initList`
341+ * whose index is greater than `afterElementIndex`, where `afterElementIndex`
342+ * is a first value-initialized element in a value-initialized range in
343+ * `initList`.
344+ */
345+ private int getNextExplicitlyInitializedElementAfter (
346+ ArrayAggregateLiteral initList , int afterElementIndex ) {
347+ isFirstValueInitializedElementInRange ( initList , afterElementIndex ) and
348+ result = min ( int i | exists ( initList .getElementExpr ( i ) ) and i > afterElementIndex )
342349}
343350
344351/**
0 commit comments