It is possible in const (anywhere where a const can be given, not just
const blocks) to be able to:
- access values inside structures
- take the address of a field.
That also works for types created by specialisation. But only if they
are specialized to a new named type.
specialization can also (in most places) be used "in place".
Are the below errors
- intentional, and meant to stay
- result of an oversight (and fixed, or considered for being fixed if
ever time allows for it)
?
program Project1;{$Mode objfpc}
type
TFoo = class
public f: integer; g: word;
public const c = 1;
end;
generic TGen<X> = class
public f: X; g: word;
public const c = 1;
end;
TBar = specialize TGen<byte>;
const
a1 = TFoo.c;
a2 = ptruint(@TFoo(nil).g);
b1 = TBar.c;
b2 = ptruint(@TBar(nil).g);
// next 2 give errro
c1 = specialize TGen<byte>.c;
c2 = ptruint(@ specialize TGen<byte>(nil).g);
var
t: ptruint;
begin
// same syntax => works:
t := specialize TGen<byte>.c;
t := ptruint(@ specialize TGen<byte>(nil).g);
end.
_______________________________________________
fpc-devel maillist - [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel