The statement ";" should not exist. It is never needed, never useful, and in most cases the compiler requires it to be replaced with '{}'. Walter and I agreed on all of the above so ";" is not present in TDPL. It should be slowly deprecated and ultimately removed from D. It is just junk in the trunk.
The one case that I'm aware of where some have argued for its value is labels. e.g. LABEL:; Since labels require a statement, ; makes it so that you can you can use a label without really having a statement. I'm not sure that that merits keeping it however, since in every other use case that I can think of, it has no value.
LABEL: {} is as good and marginally nicer.
I didn't think that that worked, since {} isn't a statement (at least, as far as I know, it isn't), but if it works, it's certainly better.
{} is the empty statement in D.
Is that different from C++? I thought that {} was just an empty scope without any statements in it at all in both C/C++ and D.
(In reply to comment #5) > Is that different from C++? I thought that {} was just an empty scope without > any statements in it at all in both C/C++ and D. It is, but in 100% of cases the compiler can optimise away that empty scope and so it's equivalent to an empty statement.
(In reply to comment #3) > I didn't think that that worked, since {} isn't a statement (at least, as far > as I know, it isn't), but if it works, it's certainly better. It is indeed a statement, it's called a block statement, also in D: http://dlang.org/statement.html#BlockStatement
(In reply to comment #0) > The statement ";" should not exist. It is never needed, never useful, and in > most cases the compiler requires it to be replaced with '{}'. > > Walter and I agreed on all of the above so ";" is not present in TDPL. It > should be slowly deprecated and ultimately removed from D. It is just junk in > the trunk. I think it is useful. This looks odd: int i = 2; for({} i<2; i++){}
(In reply to comment #8) > I think it is useful. This looks odd: > > int i = 2; > for({} i<2; i++){} The ; you're replacing there isn't a statement - it's something explicitly allowed by the ForStatement syntax. ForStatement: for (Initialize Testopt ; Incrementopt) ScopeStatement Initialize: ; NoScopeNonEmptyStatement
(In reply to comment #2) > LABEL: {} > > is as good and marginally nicer. Bear in mind that it only ever happens at the end of a block, so the next character is always a }. The existing label syntax needs to be retained for asm statements, though, since they don't have {}. asm { jmp done; done: ; } which is already ugly, and will look really silly when nude ; statements are gone. I wish we could get rid of that silly semicolon. In fact the oddity is that labels are considered to be statements, yet they don't end with a semicolon.
(In reply to comment #10) > In fact the oddity is that labels are considered to be statements, yet they > don't end with a semicolon. Block, if, while, do, for, foreach, switch, with, etc. Most types of statements don't end with a semicolon. Remember that the label statement is: Identifier : NoScopeStatement The following statement is a sub-statement of the label statement. It's not any more inconsistent than other statements with sub-statements.
I've added a warning for empty statements, but left the ; after the label as allowed. https://github.com/D-Programming-Language/dmd/commit/39d850a65ea5766a7cbd7bbe2fc8ed8e784fcdee