On Tue, 22 Feb 2011 01:08:38 -0500, %u <wfunct...@hotmail.com> wrote:

dmd is pretty lax about attributes which don't apply. It generally just ignores them. Personally,
I think that it should error on invalid attributes, but for some reason, that's not how it works. Of course, there could be other bugs in play here, but there's every possibility that the end
result is completely valid.

Well, the trouble is, pretty much all of these are invalid attributes:
- const and pure make no sense, since destructors (should) change an object's state

const is perfectly valid; From one perspective, you're rarely changing the actual object state, just free-ing allocated resources. From another, you might be logging something and don't want to accidentally change a value.

pure, especially weak purity, is expected from most destructors (and functions for that matter). And given that destructors should be able to be run on a GC thread, disabling access to TLS variables is perfectly valid.

Now, put the two together and you do end up with your hands mostly tied, but asserts are still valid as is (IIRC) freeing memory.

- override and final make no sense, since destructors obviously aren't ever overridden... they're
always called after the subclass's destructor is called

Regarding override, all class destructors are implicitly override, in which case the extra modifiers make no semantic difference. But module destructors are not virtual, so override doesn't make sense.

Regarding final, it also makes sense for classes (i.e. preventing inheritance), but again module destructors are not virtual, so final doesn't make sense in this context.

- static obviously makes no sense

As stated by others, this is a module destructor, which are declared using the static keyword.

- synchronized is meaningless since there's only one thread ever running the destructor anyway

Well, synchronized(monitor) would make perfect sense (since module destructors are run whenever a thread shuts down), and as there should be a way to manually set/get the implicit synchronized monitor, this is valid.

- private makes no sense since (unless we're trying to imitate C++ here) destructors are only
called from the runtime, and nowhere else.

Well, this comes from the fact that all functions have a protection modifier (private,package,protected,public,etc). So it's perfectly valid to stick whichever one you want on it, since none of them apply and one must be present.

Reply via email to