Previous | Index | Next 

[PRB] Pragmas related to arrays might not work if applied to a ReDim statement

The symptoms of this problem is that you apply an ArrayBounds, ArrayRank, or ShiftIndexes pragma to an array redimensioned by means of a ReDim statement:

        Sub Test()
            '## names.ArrayBounds Shift
            ReDim names(1 To 100) As Long
        End Sub

If the names array is declared elsewhere in the project with an explicit Dim statement – as a global variable in a BAS module – the pragma doesn’t have have any effect. The solution is quite simple: you must apply the pragma right before the Dim statement that declares the array.

Here’s a little background: when VB Migration Partner parses the Test method, it might or might not have already parsed the Dim statement in the BAS module. In the latter case, VB Migration Partner assumes that names is a local array that is implicitly declared by means of the ReDim statement, therefore it creates a symbol for such an array and associates the ArrayBounds pragma to this symbol. Later during the parsing process, VB Migration Partner detects the Dim statement in the BAS module and determines that names is actually a reference to the global array and that the initial assumption was wrong. However, the pragmas that have been associated with the local array are not moved to the global array.

We opted for this behavior because the same symbol might be the target of incompatible pragmas. Developers are therefore forced to apply the pragma to the array declared by the Dim statement, because this practice results in nonambiguous code.

 

Previous | Index | Next