Fix "Casting class references to void* should be @safe"

This commit is contained in:
Dennis Korpel 2025-01-08 23:24:36 +01:00
parent bd703c7136
commit 37978248a9
2 changed files with 11 additions and 7 deletions

View file

@ -181,6 +181,10 @@ bool isSafeCast(Expression e, Type tfrom, Type tto, ref string msg)
auto tfromb = tfrom.toBasetype();
auto ttob = tto.toBasetype();
// Casting to void* is always safe, https://github.com/dlang/dmd/issues/20514
if (ttob.isTypePointer() && ttob.nextOf().toBasetype().ty == Tvoid)
return true;
if (ttob.ty == Tclass && tfromb.ty == Tclass)
{
ClassDeclaration cdfrom = tfromb.isClassHandle();

View file

@ -24,9 +24,9 @@ void pointercast2()
int b;
Object c;
static assert(!__traits(compiles, cast(void*)a));
static assert(!__traits(compiles, cast(void*)b));
static assert(!__traits(compiles, cast(void*)c));
static assert(__traits(compiles, cast(void*)a));
static assert(__traits(compiles, cast(void*)b));
static assert(__traits(compiles, cast(void*)c));
}
@safe
@ -231,11 +231,11 @@ void multablecast()
static assert( __traits(compiles, cast(const(void)*)mp));
static assert( __traits(compiles, cast(const(void)*)ip));
static assert(!__traits(compiles, cast(immutable(void)*)mp));
static assert(!__traits(compiles, cast(immutable(void)*)cp));
static assert(__traits(compiles, cast(immutable(void)*)mp));
static assert(__traits(compiles, cast(immutable(void)*)cp));
static assert(!__traits(compiles, cast(void*)cp));
static assert(!__traits(compiles, cast(void*)ip));
static assert(__traits(compiles, cast(void*)cp));
static assert(__traits(compiles, cast(void*)ip));
}
@safe