Am 03.07.2012 02:51, schrieb JC Chu:
isbinaryoperatoroverloadable() is called once.  It first calls
internal_check() with the default (LHS, RHS) order.  internal_check()
accepts or rejects the pair only if it recognizes the pair.  Only if
(LHS, RHS) is not recognized, will internal_check() be called again
with the order reversed.  If neither (LHS, RHS) nor (RHS, LHS) is
recognized, isbinaryoperatoroverloadable() defaults to False.

Yes, I mean internal_check. Sorry. I hadn't the source available when I wrote you yesterday.

(Besides, commutativity is a semantic property which relies on the
user implementation and cannot be deduced at compile time.)

For commutativity regarding the implementation you are right, but I was talking about commutativity regarding the possibility to overload. E.g. you should be able to overload "and" no matter whether it's argument types are "(String, LongInt)" or "(LongInt, String)".

Rejection rules are used to prevent conflicts with the default
interpretation.  The original implementation, however, rejects
overloads based solely on the operand type combination, not taking
into consideration the operator being used.  For the
string-as-the-first-operand case, this resulted in, say, * as a
function on (string, PChar) being rejected, which is legal.  What I
did with it is restrict the operand to +, =,<>,<,<=,>, and>=
(and, of course, removing the limits on the second operand being an
enumeration).
>
For some operators, only one-sided protection is necessary.  For
example, IN must not be overloaded as a function on (<enumeration>,
<set>).


Agreed so far. :)

For some operators, the set of accepted operand type pairs should be
symmetric, and thus so should its complement, the set of rejected
pairs.  If acceptance and rejection rules are inconsistent, rejection
becomes sensitive to the order of operands.  For example, I didn’t
change pointer-as-the-first-operand case to allow for (PChar, string)
overloads, so * as a function on (PChar, string), despite legal, still
gets rejected.

That is to say, the rules in internal_check() are not yet exhaustive.

So in the end "* (PChar, String)" should be allowed as well out of consistency, shouldn't it?

Nevertheless for pointers one needs to be careful, as I don't know exactly how far internal pointer arithmetic operators are available (AFAIK at least "+" and maybe "-" exist).

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to