On Monday, April 01, 2013 22:32:01 =?UTF-8?B?Ikx1w61z?=.Marques <luismarq...@gmail.com>@puremagic.com wrote: > I added a bug to the database, because the following code results > in a segfault (DMD v2.062, OS X 10.8.3, 64-bit): > > #!/usr/local/bin/rdmd > > @safe: > > void main() > { > int[string] a; > a["foo"] = 0; > a.remove("foo"); > assert(a != null); // segfault (not exception) > } > > Now I come here for some further clarifications. While it seems > fairly clear to me that the assert should not crash the program > with a segmentation fault (at least with @safe), is the assert > actually true? (Is it even specified by the language if the AA > can become null again, after removing the last item?) > > Second, I didn't test this in other OSes, but assuming the bug is > reproducible, am I actually the first one to trip on this issue? > It seems too basic, but I didn't find a duplicate in the bug > database.
The problem is that you're using != with null. Don't do that. If you want to check whether something is null, use the is operator: assert(a !is null); If you use == or !=, it's going to do compare the objects, not their pointers/references, and in the case of an AA, that means that it's going to dereference them both and compare their contents. And since null is well, null, dereferencing it results in a segfault. If you try and compare objects with null with ==, you get an error. The compiler should probably do the same with AAs but apparently doesn't. So, if there's a bug, it's the fact that the compiler allows the comparison in the first place. Otherwise, there's no bug here. - Jonathan M Davis