[fpc-pascal] Operator overloading broken in 1.9.6?

Peter Vreman peter at freepascal.org
Mon Jan 3 14:33:59 CET 2005


> Hi,
>
> just installed 1.9.6 to see if any of our current code will break and
> unfortunately I wasn't disappointed. ;-)
>
> stripped down code:
>
> -- 8< -- snip --
> unit
>    StrTools;
>
> interface
>
> operator * (const C : Char; const Len : byte) s : String;
>
> implementation
>
> operator * (const C : Char; const Len : byte) s : string;
> var
>    i : byte;
> begin
>    s := '';
>
>    for i := 1 to Len do
>       s := s + C;
> end {"*"};
>
> end {StrTools}.
> -- 8< -- snip --
>
> This compiled fine with 1.0.10, but 1.9.6 now bails out with "Error:
> Impossible operator overload" as early as at the line where the
> operator is declared.
>
> Is this a bug? A feature? Or just me being stupid?

There must be at least one complex type record/string/array involved. Your
example is only using 2 ordinal types. At the time that the expression is
parsed the result is not known so the complex string result has no
influence.

Example of things that are ambigious:

procedure p1(b:byte);
procedure p1(s:string);

p1(char*byte);

This can be a missing type cast and therefor the compiler shall give an
error. Also you can see here that the result of byte*char can't be known
yet at the time it is parsed. Because the type of the argument needed by
p1() can be either string or byte.







More information about the fpc-pascal mailing list