On 17.08.23 20:08, Michael Van Canneyt wrote:
[...]
Both FPC and Delphi create different classes for TDoubleBird and
TMyDoubleBird.
In Delphi they are not assign compatible, in FPC they are. For example:
var
a: TDoubleBird;
b: TMyDoubleBird;
begin
b:=TMyDoubleBird.Create;
a:=b; // forbidden in Delphi
writeln(a is TDoubleBird); // writes false
Bytewise the assignment is ok, but logic wise "a" is no longer a
TDoubleBird.
Is this a bug or a feature?
Depends on how you look at it. Double and TMyDouble are assignment
compatible.
There is no reason why the same should not hold true for TDoubleBird and
TMyDoubleBird ?
I guess that is true for specialized arrays, records (non advanced),
proc types and pointers, unless I forgot something (maybe helpers?).
But classes and interfaces have "is", "as", "class of", and "class
vars", where the difference matter.
[...]
Of course, the method addresses are different. Other than that and the
different RTTI (which has 100% the same structure)
The different RTTI has 100% the same structure?
For clarification for others to follow the discussion here is an example:
type
TBird<T> = class(TPersistent)
private
FWing: T;
published
property Wing: T read FWing;
end;
This is allowed in Delphi, but FPC refuses generic templates in published.
The TBird<double>.Wing has a different PPropInfo than
TBird<TMyDate>.Wing. That is probably only relevant in some rare cases.
I am inclined to go for feature, but maybe there are arguments to tip the
balance in the direction of bug.
One point where it could wrong, is when you port Delphi code to FPC.
For example this is fine in Delphi:
type
TBird<T> = class
class var Cnt: integer;
end;
TDoubleBird = TBird<double>;
procedure Fly(b: TDoubleBird);
begin
inc(b.Cnt); // under Delphi this must be TBird<double>.Cnt
// not so under FPC
...
if TDoubleBird.Cnt=1 then ...
end;
Mattias
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel