X-Sharp / XSharpPublic

Public repository for the source code for the XSharp Compiler, Runtime, Project System and Tools.
Apache License 2.0
89 stars 36 forks source link

Passing array reference or ivar by reference doesn't work (XBase++) #1492

Closed DenGhostYY closed 18 hours ago

DenGhostYY commented 2 weeks ago

Describe the bug Passing by reference does not work for array elements and object fields.

Example 1

procedure main()
    local a := {1, 2, 3}
    local nLen := Len(a)
    local i

    for i := 1 to nLen
        _Increment(@a[i])
    next

    for i := 1 to nLen
        ? a[i]
    next
return

static procedure _Increment(nNumber)
    nNumber++
return

Expected behavior (XBase++ exe) Output

2
3
4

Actual behavior (X# compiler)

error XS0206: A property or indexer may not be passed as an OUT or REF parameter

Example 2

procedure main()
    local o := Example():new(3)

    _Increment(@o:nNumber)

    ? o:nNumber
return

class Example
exported:
    var nNumber

    inline method init(nNumber)
        ::nNumber := nNumber
    return
endclass

static procedure _Increment(nNumber)
    nNumber++
return

Expected behavior (XBase++ exe) Output

4

Actual behavior (X# exe) No compilation errors and warnings

3

Additional context X# Compiler version 2.20.0.3 (public) -dialect:xBase++ -codepage:866 -lb -enforceself -memvar -xpp1 -vo1 -vo3 -vo4 -vo5 -vo9 -vo10 -vo12 -vo13 -vo14 -vo15 -vo16 -vo17 -reference:XSharp.Core.dll -reference:XSharp.RT.dll -reference:XSharp.XPP.dll

RobertvanderHulst commented 6 days ago

For now we recommend to use an intermediate variable when passing array elements or instance variables by references.

var temp := a[i]
_Increment(@temp)
a[i] := temp

and

var temp := o:nNumber
_Increment(@temp)
o:nNumber := temp

We'll try to fix this in the compiler. but that is not trivial

RobertvanderHulst commented 18 hours ago

Awesome. Thanks