[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