Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 2ff15e8

Browse files
committed
__delete shouldn't segfault for null
1 parent 3334ab0 commit 2ff15e8

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

src/core/memory.d

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,13 +1012,19 @@ void __delete(T)(ref T x) @system
10121012

10131013
static if (is(T == interface) || is(T == class))
10141014
{
1015-
GC.free(cast(void*) x);
1016-
x = null;
1015+
if (x !is null)
1016+
{
1017+
GC.free(cast(void*) x);
1018+
x = null;
1019+
}
10171020
}
10181021
else static if (is(T == U2*, U2) || is(T : E2[], E2))
10191022
{
1020-
GC.free(&x);
1021-
x = null;
1023+
if (x !is null)
1024+
{
1025+
GC.free(&x);
1026+
x = null;
1027+
}
10221028
}
10231029
}
10241030

@@ -1151,4 +1157,17 @@ unittest
11511157
{
11521158
Object x = null;
11531159
__delete(x);
1160+
1161+
struct S { ~this() { } }
1162+
class C { }
1163+
interface I { }
1164+
1165+
int[] a; __delete(a);
1166+
S[] as; __delete(as);
1167+
C c; __delete(c);
1168+
I i; __delete(i);
1169+
C* pc = &c; __delete(*pc);
1170+
I* pi = &i; __delete(*pi);
1171+
int* pint; __delete(pint);
1172+
S* ps; __delete(ps);
11541173
}

0 commit comments

Comments
 (0)