I found something sneaky I'd like to confirm before I decide what to do about 
it.

1) "T" in TAnyClass<T> is specialized as Integer from the first parameter with 
TSomeClass (which is TAnyClass<Integer>).
2) "U" is getting specialized as String by looking at the parameters in 
Compare() in which "U"(the second generic parameter) is String.

This specializes the procedure correctly but it uses a very sneaky method which 
is very hard to discern. I feel like that if a generic parameter is already 
used (like T in specialize TCallback<T, U>) then no further attempt should be 
made to look at the parameters and in the example below "U" would not be found 
and the function would fail to implicitly specialize.

==============================

type
  generic TAnyClass<U> = class
    type TElem = U;
  end;

type
  TSomeClass = specialize TAnyClass<Integer>;

type
  generic TCallback<T, U> = function(a: T; b: U): integer;

function Compare(a: TSomeClass.TElem; b: string): integer;
begin
  result := 1;
end;

generic procedure DoThis<T, U>(aClass: specialize TAnyClass<T>; callback: 
specialize TCallback<T, U>);
begin
  callback(1, 'string');
end;

begin
  DoThis(TSomeClass.Create, @Compare);
end.

Regards,
        Ryan Joseph

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to