On Thu, 08 Oct 2009 15:48:56 +0400, Steven Schveighoffer <schvei...@yahoo.com> wrote:

On Thu, 08 Oct 2009 07:26:37 -0400, Denis Koroskin <2kor...@gmail.com> wrote:

On Thu, 08 Oct 2009 14:48:19 +0400, Steven Schveighoffer <schvei...@yahoo.com> wrote:

On Wed, 07 Oct 2009 17:54:35 -0400, Denis Koroskin <2kor...@gmail.com> wrote:

On Wed, 07 Oct 2009 23:00:06 +0400, Sean Kelly <s...@invisibleduck.org> wrote:

auto x = cast(MyClass) malloc(MyClass.classinfo.init.length);

I would expect a dynamic cast to occur at this line. Which will either result in an access violation (since you are trying to cast a garbage to an object) or result in a null being returned.

malloc returns void *, so no dynamic cast.

-Steve

I know malloc returns void*. I didn't know you can hijack type system that easily.

But then, if no dynamic cast takes place why cast(Object)cast(void*)0 cannot be evaluated at compile time?

Your message made me test it :)

import std.stdio;

void *foo()
{
     return cast(void*)0;
}

void main()
{
     auto o = cast(Object)foo();
     writefln("here!");
     o.opEquals(o);
}

outputs:

here!
Segmentation fault

So, no dynamic cast (dynamic cast would have looked at the classinfo of null, segfaulting before the output).


No, IIRC, casting null to Object is perfectly valid and returns null.

But you are right, casting void* to Object does a reinterpret cast instead
of dynamic cast. I'm not sure if that's a good design decision, though.

So I would say, the fact that compile time evaluation doesn't work is a bug maybe?

-Steve

Probably. Not only it doesn't work at compile time, it doesn't work at all!

void main()
{
auto o = cast(Object)cast(void*)0; // Error: cannot cast void* to object.Object
}

Reply via email to