!standard 5.1(2) 09-10-29 AI05-0179-1/01 !class Amendment 09-10-29 !status work item 09-10-29 !status received 09-10-29 !status received !priority Low !difficulty Easy !subject Labels at end of a sequence_of_statements !summary A label is allowed at the end of a sequence_of_statements. !problem One of the most common uses of gotos in Ada is to "continue" a loop. That is, complete the current iteration and go on to the next one. Nearly 25% of the gotos in the GNAT compiler are for this purpose. This looks something like: loop ... goto Continue; -- Usually deeply nested. ... <> null; end loop; The "null;" here is just noise. We're going to the end of the construct. But we need the "null;" since a label is not allowed at the end of a sequence_of_statements. Labels don't have anything in particular to do with statements, they just mark a place in the program text. So the requirement to add the "null;" adds no benefit at all; it should be eliminated (especially as a large percentage of uses of labels are currently saddled with this noise). !proposal (See summary.) !wording Modify 5.1(2) to: sequence_of_statements ::= statement {statement} {label} [Editor's note: It might be better to move all of the {label}s here.] !discussion It is odd indeed that a label can *start* a sequence of statements, but it cannot *end* a sequence of statements. There is no practical difference in readability. We retain the requirement that a sequence of statements include at least one statement (a label all by itself is still not allowed). So if A then <> -- Illegal end if; but if A then <> null; end if; and if A then null; <> end if; are allowed. !example loop ... goto Continue; -- Usually deeply nested. ... <> end loop; --!corrigendum 5.1(2) !ACATS test Update the existing ACATS B-Test to test the syntax changes. !appendix From: Robert Dewar Sent: Saturday, October 17, 2009 4:25 AM [Editor's note: forked from the thread in AI05-0180-1.] > The only reason to have a feature is to help out the "goto-adverse", > and using the keyword "goto" isn't going to make them very happy. Right, also the requirement for null after the Continue label is an irritation, perhaps we could at least remove that entirely useless requirement, and allow a label to appear on an end line. **************************************************************** From: Bob Duff Sent: Saturday, October 17, 2009 12:13 PM > > The only reason to have a feature is to help out the "goto-adverse", > > and using the keyword "goto" isn't going to make them very happy. > > Right, also the requirement for null after the Continue label is an > irritation, perhaps we could at least remove that entirely useless > requirement, and allow a label to appear on an end line. OK, after all my recent negativity, I'll say something positive. ;-) I support the idea of changing the syntax as Robert suggests. It's a trivial change to implementations. Intuitively, a label marks a "place" in a sequence of statements. It doesn't mark a particular statement. If you "goto" that place, you don't just execute the one labeled statement as the current syntax would imply -- you start executing there and continue on with all the rest of the statements. Therefore, it makes perfect sense to have a label after the last statement in a sequence; the "null;" is just noise. For that matter, I'd allow: procedure P (...) is begin -- Nothing to do. end P; and: procedure P (...) is begin pragma Assert (...); end P; But those may be controversial. Surely the label case is not controversial. **************************************************************** From: Bob Duff Sent: Sunday, October 18, 2009 1:11 PM > >> I must say I am surprised by Erhard saying he has >> never felt a > need for this, I find it pretty >> common, and a grep for "goto > Continue" in the >> GNAT sources gets 65 hits. Probably Erhard meant that he doesn't need a new feature for this, since often an 'if' works fine, and when it doesn't, an 'if...goto' works just fine. > > That's 65 cases in 1,041,737 lines of code. > > 65/1,041,737 = 0.00006, which I wouldn't call > "pretty common". > > What is that as a percentage of all the uses of 'goto' in the GNAT > sources? I count 522 goto statements. (A bit surprising -- I would have guessed 100 or so.) 72 of these are "goto Continue;" (not sure why Robert got 65), but there are other labels that look like the programmer was thinking "continue": goto Cont; goto Cont1; goto Cont2; goto Continue; goto Continue_Main_Component_Loop; goto Line_Loop_Continue; goto Loop_Continue; goto Ploop_Continue; goto Rloop_Continue; The above account for 118 goto statements. 522/1,041,737 = 0.0005 118/522 = 0.23 ****************************************************************