> On Apr 6, 2021, at 11:34 PM, Sven Barth <[email protected]> wrote:
>
> In the second case the compiler will have the non-generic Test(String) due to
> the implicit operator as well as Test<LongInt>(LongInt) due to the implicit
> specialization. Here it will pick the generic one, because a call without a
> type conversion is considered better.
I finally get what you're saying and get the correct results now after moving
my check inside the if/then block. I didn't realize that the operator overload
was causing a type conversion that the overloading system knew about. So the
non-generic still wins unless the type conversion happened due to the operator
overload and then the generic wins.
Writeln(Test('Hello World')); // Test(String)
Writeln(Test(42)); // Test<String>
Writeln(Test(String(42))); // Test(String)
As for $H+ do we really want string literals likes 'ABC' to change? I wouldn't
think so. Here's my string literal type symbol conversion in
create_unamed_typesym I'm using now:
case tstringdef(def).stringtype of
st_shortstring:
newtype:=search_system_type('SHORTSTRING');
st_longstring,
st_ansistring:
newtype:=search_system_type('ANSISTRING');
st_widestring:
newtype:=search_system_type('WIDESTRING');
st_unicodestring:
newtype:=search_system_type('UNICODESTRING');
end;
'Hello World' is parsed as st_shortstring so we use System.ShortString for
specialization. Given that I don't think I need to do anything with $H+.
Regards,
Ryan Joseph
_______________________________________________
fpc-devel maillist - [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel