On 20/12/2012 12:00, monarch_dodra wrote:
I had (some time ago), created a request for breakable labeled blocks:
http://d.puremagic.com/issues/show_bug.cgi?id=8622

Now apparently, there is a "LabeledStatement" in D:
http://dlang.org/statement.html#LabeledStatement

"Any statement can be labeled, including empty statements, and so can
serve as the target of a goto statement. Labeled statements can also
serve as the target of a break or continue statement."

Never mind that you *can't* break out of a LabeledStatement (*only*
labeled if/for/while), what I find spectacularly confusing is that this:
LabeledStatement:
   Identifier : NoScopeStatement

"NoScopeStatement" means (apparently):

//---- Legal Code
int main()
{
   label:
   {
     int a = 4;
   }
   a = 4;
}
//----
//---- Illegal Code
int main()
{
   label1:
   {
     int a = 4;
   }
   label2:
   {
     int a = 4;
   }
}
//----
This behavior is because (apparently) a label followed by a "{}" does
not create a new scope (!). Is this really what "NoScopeStatement" even
means? I'd figure what I just wrote is a BlockStatement that's nested
inside a NoScopeStatement...

I'm trying to wrap my head around: Is this valid and behaving according
to spec?

I think so, judging from Walter's comments in the bug reports.

In particular, if this is "according to spec", what is the rationale for
having the spec that way anyways? How is this any better then what we
have in C? I don't suppose we deviate just for the fun of deviating...?

In particular, I know I write BlockStatements all over the place,
*especially* when labels and gotos start getting involved (to avoid
jumping past declarations) I think this "feature" is at best useless,
and at worst dangerous.

Anybody have any insight on why we even have this?

I for one can't work out why anyone working to the spec would want to put braces after a label, knowing that they have no effect. It's very unintuitive.

I think it is a bug-prone design, considering the bug report examples.

Reply via email to