[fpc-pascal] Error: Can't take the address of constant expressions

Bernd prof7bit at gmail.com
Tue Sep 25 19:18:42 CEST 2012


2012/9/25 patspiper <patspiper at gmail.com>:
> Hi,
>
> Despite
> http://wiki.freepascal.org/User_Changes_2.4.0#Treating_direct-mapped_properties_as_regular_fields,
> shouldn't the following be legal? I tested under FPC 2.6.1 and 2.7.1.

This shouldn't even matter here since IMHO it should work even if Ref
were a function (and it works if Ref is a function), it should always
work as long as the expression before the ^ is a pointer type.

And interestingly this works also (as it should):

type
  TMyClass = class
  private
    FRef: Pointer;
  public
    property Ref: Pointer read FRef write FRef;
  end;

var
  MyClass1, MyClass2: TMyClass;

procedure test;
begin
  Move(MyClass1.Ref^, MyClass2.Ref^, 1);
end;

but

Move(MyClass1.Ref, MyClass2.Ref, SizeOf(TMyClass.Ref));

will give an error (as it should), no matter how its internally
represented because the code that is using this property should not be
expected to make assumptions about internal compiler optimizations, it
should always treat it like a property.

But your example should work, IMHO you have found a bug.



More information about the fpc-pascal mailing list