D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 7133 - [tdpl] There should be no empty statement
Summary: [tdpl] There should be no empty statement
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 enhancement
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-12-18 18:17 UTC by Andrei Alexandrescu
Modified: 2011-12-29 02:23 UTC (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Andrei Alexandrescu 2011-12-18 18:17:17 UTC
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.
Comment 1 Jonathan M Davis 2011-12-18 18:25:35 UTC
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.
Comment 2 Andrei Alexandrescu 2011-12-18 18:26:14 UTC
LABEL: {}

is as good and marginally nicer.
Comment 3 Jonathan M Davis 2011-12-18 18:28:18 UTC
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.
Comment 4 Andrei Alexandrescu 2011-12-18 20:06:48 UTC
{} is the empty statement in D.
Comment 5 Jonathan M Davis 2011-12-18 20:11:40 UTC
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.
Comment 6 Stewart Gordon 2011-12-19 05:07:21 UTC
(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.
Comment 7 Jakob Ovrum 2011-12-19 05:16:39 UTC
(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
Comment 8 timon.gehr 2011-12-19 06:23:35 UTC
(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++){}
Comment 9 Stewart Gordon 2011-12-19 07:17:31 UTC
(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
Comment 10 Don 2011-12-24 04:41:20 UTC
(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.
Comment 11 Jakob Ovrum 2011-12-25 01:03:29 UTC
(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.
Comment 12 Walter Bright 2011-12-29 02:23:17 UTC
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