digitalmars.D.bugs - Weird overload resolution (or rather, lack thereof) for literals
- Stewart Gordon (45/45) Oct 13 2005 Using DMD 0.131 (has DMD itself actually changed since then?), Windows 9...
- Thomas Kuehne (12/48) May 21 2006 -----BEGIN PGP SIGNED MESSAGE-----
Using DMD 0.131 (has DMD itself actually changed since then?), Windows 98SE.
----------
enum Qwert { yuiop }
void asdfg(Qwert hjkl) { printf("Called hjkl(Qwert)\n"); }
void asdfg(uint zxcvb) { printf("Called hjkl(uint)\n"); }
void main() {
int nm = 2;
asdfg(nm);
asdfg(cast(int) nm);
asdfg(3);
asdfg(cast(int) 3);
}
----------
D:\My Documents\Programming\D\Tests\implicit_enum.d(11): function
implicit_enum.asdfg called with argument types:
(int)
matches both:
implicit_enum.asdfg(Qwert )
and:
implicit_enum.asdfg(uint)
D:\My Documents\Programming\D\Tests\implicit_enum.d(12): function
implicit_enum.asdfg called with argument types:
(int)
matches both:
implicit_enum.asdfg(Qwert )
and:
implicit_enum.asdfg(uint)
Tool completed with exit code 1
----------
For the integer variable, it manages to resolve the overload. Indeed,
it calls the uint version.
However, with the literal, it doesn't, even if it has been cast. This
is absurd. Just as integer variables don't implicitly convert to enums,
neither should integer literals. And that line 10 passes but line 12
doesn't is even more absurd, as both have the same type set in the same
amount of stone.
Stewart.
--
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/M d- s:- C++ a->--- UB P+ L E W++ N+++ o K- w++ O? M V? PS-
PE- Y? PGP- t- 5? X? R b DI? D G e++>++++ h-- r-- !y
------END GEEK CODE BLOCK------
My e-mail is valid but not my primary mailbox. Please keep replies on
the 'group where everyone may benefit.
Oct 13 2005
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Stewart Gordon schrieb am 2005-10-13:
Using DMD 0.131 (has DMD itself actually changed since then?), Windows 98SE.
----------
enum Qwert { yuiop }
void asdfg(Qwert hjkl) { printf("Called hjkl(Qwert)\n"); }
void asdfg(uint zxcvb) { printf("Called hjkl(uint)\n"); }
void main() {
int nm = 2;
asdfg(nm);
asdfg(cast(int) nm);
asdfg(3);
asdfg(cast(int) 3);
}
----------
D:\My Documents\Programming\D\Tests\implicit_enum.d(11): function
implicit_enum.asdfg called with argument types:
(int)
matches both:
implicit_enum.asdfg(Qwert )
and:
implicit_enum.asdfg(uint)
D:\My Documents\Programming\D\Tests\implicit_enum.d(12): function
implicit_enum.asdfg called with argument types:
(int)
matches both:
implicit_enum.asdfg(Qwert )
and:
implicit_enum.asdfg(uint)
Tool completed with exit code 1
----------
For the integer variable, it manages to resolve the overload. Indeed,
it calls the uint version.
However, with the literal, it doesn't, even if it has been cast. This
is absurd. Just as integer variables don't implicitly convert to enums,
neither should integer literals. And that line 10 passes but line 12
doesn't is even more absurd, as both have the same type set in the same
amount of stone.
Added to DStress as
http://dstress.kuehne.cn/run/o/overload_26_A.d
http://dstress.kuehne.cn/run/o/overload_26_B.d
Thomas
-----BEGIN PGP SIGNATURE-----
iD8DBQFEcL9q3w+/yD4P9tIRAvehAJ9qK4MMTukennpThWOTEbYz0o/HNwCgyGQI
655YZjqDsA9BA6QYNPZg4I4=
=PhVn
-----END PGP SIGNATURE-----
May 21 2006








Thomas Kuehne <thomas-dloop kuehne.cn>