According to
https://forum.lazarus.freepascal.org/index.php/topic,52157.msg383991.html#msg383991

1) Contstraint given in the interface declaration MUST be dropped in the implementation  (though it does not explicitly mention methods in a class in the interface or implementation)

2) Constraints in a "forward" declaration in the implementation (or a program?) must be kept.

But I cannot figure out how to do it for "const" constraints

For FooProc3 neither keeping, nor dropping works. Both give errors.

program Project1; {$mode ObjFPC}
type
  generic TGeneric1<G1Param> = class end;

  TFoo = class
    generic procedure FooProc1<T1: specialize TGeneric1<byte>; T2: TObject>(a: T1);
    generic procedure FooProc2<T1; T2: TObject>(a: T1);
    generic procedure FooProc3<T1; const T2: integer>(a: T1);
  end;

generic procedure TFoo.FooProc1<T1; T2>(a: T1); begin {} end;
generic procedure TFoo.FooProc2<T1; T2>(a: T1); begin {} end;

//generic procedure TFoo.FooProc3<T1; T2>(a: T1); begin {} end;  // project1.lpr(16,24) Error: Function header doesn't match any method of this class "FooProc3$2(T1);" generic procedure TFoo.FooProc3<T1; const T2: integer>(a: T1); begin {} end;   // project1.lpr(17,43) Error: Generic constraint not allowed here

begin
end.



Also, forward seems to have lost all checking.
It compiles, even if the forward has a different constraint.


program Project1;
{$mode ObjFPC}
  type
    TX1 = class end;
    TX2 = class end;


  generic procedure Proc4<T1; T2: TX1>(a: T1); forward;

  generic procedure Proc4<T1; T2:TX2>(a: T1); begin {} end;

begin

end.

_______________________________________________
fpc-devel maillist  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to