with() statement doesn't want to work with property functions

Timon Gehr timon.gehr at gmx.ch
Sun Sep 18 08:56:26 PDT 2011


On 09/18/2011 05:14 PM, Andrej Mitrovic wrote:
> struct Bar { int x; }
> struct Foo
> {
>      Bar _bar;
>      Bar bar()
>      {
>          return _bar;
>      }
> }
>
> void main()
> {
>      Foo foo;
>      with (foo.bar)
>      {
>      }
> }
>
> Error: foo.bar() is not an lvalue
>
> I've made a getter because I want to control how _bar is manipulated.
> I've lost the ability to use the with statement, which is a minor
> inconvenience. Is there a specific reason why with() should not be
> allowed to be used with property functions?
>
> This works fine:
>
> immutable Foo foo;
> with (foo)
> {
> }
>
> So I don't see why it shouldn't work on property functions?

It is that way because the implementation of with is still a quick hack. 
I think it is implemented like this:

1. If the scope does not require a 'this' pointer, just do lookup 
differently.

2. If the scope does require a 'this' pointer, declare a hidden pointer 
to the value of the expression, and redirect all lookups that must be 
performed on the expression to that pointer.

Obviously, if the address of the expression cannot be taken, the 
compiler should actually store the expression in a hidden stack 
variable. I think this is worth a bug report if it is not known already.









More information about the Digitalmars-d-learn mailing list