[Issue 6288] New: std.conv.to removes const/immutable when converting a class
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Jul 11 10:24:23 PDT 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6288
Summary: std.conv.to removes const/immutable when converting a
class
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P2
Component: Phobos
AssignedTo: nobody at puremagic.com
ReportedBy: schveiguy at yahoo.com
--- Comment #0 from Steven Schveighoffer <schveiguy at yahoo.com> 2011-07-11 10:19:14 PDT ---
The code in std.conv.to looks like this for converting to base/derived class:
/**
Object-to-object conversions throw exception when the source is
non-null and the target is null.
*/
T toImpl(T, S)(S value) if (is(S : Object) && is(T : Object))
{
auto result = cast(T) value;
if (!result && value)
{
throw new ConvException("Cannot convert object of static type "
~S.classinfo.name~" and dynamic type "~value.classinfo.name
~" to type "~T.classinfo.name);
}
return result;
}
This does not take into account that cast can easily remove const or immutable
decorations.
For example:
import std.conv;
class C {}
class D : C {}
void main()
{
const(C) c = new D;
D d = to!D(c);
assert(d !is null);
}
This compiles as of 2.054, and clearly is removing const without requiring a
cast.
Unfortunately, cast() is the mechanism to do dynamic conversions, so the logic
to allow compilation needs to check that const is not being removed or
immutable is not being removed/added.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list