opCast fails when this is null.

Nicholas Wilson iamthewilsonator at hotmail.com
Sat Oct 28 14:19:01 UTC 2017


On Saturday, 28 October 2017 at 13:24:49 UTC, Mike Wey wrote:
> The following code runs correctly when compiled with ldc 
> (1.4.0) but fails with an assert error when compiled with dmd 
> (2.076 and ldc 1.2.0)
>
>
> ```
> class A
> {
>
> }
>
> class B
> {
> 	T opCast(T)()
> 	{
> 		return this;
> 	}
> }
>
> void main()
> {
> 	A a = null;
> 	B b = null;
>
> 	auto c = cast(Object)a;
> 	auto d = cast(Object)b; // Fails with: 
> core.exception.AssertError at test.d(8): null this
> }
> ```
>
> How would you write an opCast that would handle this case 
> correctly?
>
> Testing if this is null at the start of the opCast doesn't help 
> since the assert is thrown before that happens.
> Making the opCast static leaves us without access to this, 
> which would be needed in my use case.
> We can't relay on ufcs since the rewrite to opCast doesn't 
> happen when it's not a member function.

As Basile mentioned, this is compiler sticking checks in behind 
your back.
The reason it works on new LDC is because #6982 was cherry picked 
to LDC (1.3?) before it was merged into dmd (not sure what 
version, I though it was 2.076, but it might have been one of the 
betas of 2.077) because I needed it for DCompute to build without 
-release.

The only course is to use recent compilers.


More information about the Digitalmars-d-learn mailing list