ISO/IEC JTC1/SC22/WG14 N740 Mixing declarations and code Final wording changes Clive D.W. Feather Related Documents: N503, N712 In 6.1.2.4, third paragraph, replace: If an initialization is specified for the value stored in the object, it is performed on each normal entry, but not if the block is entered by a jump to a labelled statement. with: If an initialization is specified for the value stored in the object, it is performed on each normal entry, but not if the block | is entered by a jump to a labelled statement beyond the declaration. | A backwards jump might cause the initializer to be evaluated more | than once; if so, a new value will be stored each time. Replace subclause 6.6.2 syntax by: compound-statement: | { block-item-list-opt } | | block-item-list: | block-item | block-item-list block-item | | block-item: | declaration | statement Change 6.6.2 paragraph to from: A compound statement (also called a block) allows a set of statements to be grouped into one syntactic unit, which may have its own set of declarations and initializations (as discussed in 6.1.2.4). The initializers of objects that have automatic storage duration are evaluated and the values are stored in the objects in the order their declarators appear in the translation unit. to: A compound statement (also called a block) allows a set of statements to be grouped into one syntactic unit, which may have its own set of declarations and initializations (as discussed in 6.1.2.4). The initializers of objects that have automatic storage duration are evaluated and the values | are stored in the objects (including storing an indeterminate | value in objects without an initializer) each time that the | declaration is reached in the order of execution, as if it | were a statement, and within each declaration in the order | that the declarators appear. Change the 6.6.5 syntax from: iteration-statement: while ( expression ) statement do statement while ( expression ) ; for ( expression-opt ; expression-opt ; expression-opt } statement to: iteration-statement: while ( expression ) statement do statement while ( expression ) ; for ( expression-opt ; expression-opt ; expression-opt } statement | for ( declaration ; expression-opt ; expression-opt } statement Replace 6.6.5.3 by: Except for the behaviour of a continue statement in the loop body, the statement | for ( clause-1 ; expression-2 ; expression-3 ) statement | | and the block | | { | clause-1 ; | while ( expression-2 ) { | statement | expression-3 ; | } | } | | are equivalent (where clause-1 can be an expression or a | declaration). [93] | Both clause-1 and expression-3 can be omitted. If either or both | are an expression, they are evaluated as as a void expression. An omitted expression-2 is replaced by a nonzero constant. Change footnote 93 from: [93] Thus, expr-1 specifies initialization for the loop; expr-2, the controlling expression, specifies an evaluation made before each iteration, such that execution of the loop continues until the expression compares equal to 0; expr-3 specifies an operation (such as incrementing) that is performed after each iteration. to: | [93] Thus, clause-1 specifies initialization for the loop, | possibly declaring one or more variables for use in the loop; expr-2, the controlling expression, specifies an evaluation made before each iteration, such that execution of the loop continues until the expression compares equal to 0; expr-3 specifies an operation (such as incrementing) that is performed after each iteration. | If clause-1 is a declaration, then the scope of any variable it | declares is the remainder of the declaration and the entire loop, | including the other two expressions. ======== At the WG14 London meeting, the document was amended prior to approval by adding a further editing instruction: Add a Constraint to subclause 6.6.5: The declaration in a for loop shall only have a storage class of auto or register.