Document number: WG14/N779 (J11/97-143) Date: 26-Sep-97 Title: Draft 11Pre3 Edit Issues List Authors: Jim Thomas, Tom MacDonald, Clive Feather, Douglas Walls, J. Benito Date: 26 Sep 1997 ########################################################################### Corrections not attributable to any specific proposal: Page 16, 5.2.1 Character sets still needs a forward reference to "string (7.1.1)" ______________________________ Page 17, 5.2.1 Character sets universal-character-name: \u hex-quad \U hex-quad hex-quad In the postscript version the "\u" and "\U" should be in courier-bold. ______________________________ Page 28, 6.1.1 Keywords Syntax [#1] keyword: one of auto break case char complex const continue default do double else enum extern float for goto if imaginary inline int | long register restrict return | short signed sizeof static | struct switch typedef union | unsigned void volatile while | ^^^^ Formatting problem with "void" ______________________________ Page 30, 6.1.2.1 Scopes of identifiers paragraph 1, "for" should be "For". ______________________________ Page 33, 6.1.2.4 Storage durations of objects prior to program startup. The object exists, had a constant | ^^^ has ______________________________ Page 32, 37 6.1.2.5 Types [#25] Any type so far mentioned is an unqualified type. Each unqualified type has three corresponding qualified versions of its type:35 a const-qualified version, a volatile-qualified version, and a version having both qualifications. The qualified or unqualified versions of a type are distinct types that belong to the same type category and have the same representation and alignment requirements.28 A derived type is not qualified by the ^^ qualifiers (if any) of the type from which it is derived. [#26] A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements.28 ^^ These footnote 28s refer to a footnote on another page. Is this what is intended? We sort of duplicate footnote 33 as 38 so it's confusing cause we've never done this in the standard before. What was intended? [[... also para. 25 fails to mention "restrict" - bigger problem ...]] ______________________________ Page 40, 6.1.2.8.2 Integral types [#1] For unsigned integral types other than unsigned char, the bits of the object representation shall be divided into two groups: value bits and padding bits (there need not be any of the latter). If there are N value bits, each bit shall represent a different power of 2 between 1 and 2**(N-1), ^^^^^^^^ so that object of that type shall be capable of ^^^^^^ objects representing values from 0 to 2**N-1 ....... ^^^^^^ ......... (if there are M value bits in the signed type and N is the unsigned type, then M <= N). If the sign bit ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This parenthetical remark doesn't read right - Clive???? is zero, it shall not affect the resulting value. if the | ^^ If - the sign bit has the value -2**N; ^^^^^ - the sign bit has the value 1-2**N. ^^^^^^ These "2**N" formatting is Fortran specific and should be changed to use superscripts. They will be much easier to read that way. Also, "object" should be "objects" and "if" should be "If" ______________________________ Page 52, 6.1.9 Comments Examples [#3] 'c//d' // four-character constant "a//b" // four-character string literal #include "//e" // undefined behavior // */ // comment, not syntax error f = g/**//h; // equivalent to f = g / h ^^^^^^^^^ courier??? i(); // part of a two-line comment /\ / j(); // part of a two-line comment #define glue(x,y) x##y glue(/,/) k(); // syntax error, not comment /*//*/ l(); // equivalent to l(); ^^^^ courier??? m = n//**/o + p; // equivalent to m = n + p ^^^^^^^^^ courier??? Seems like it's more consistent with the rest of the Draft if the above are in courier-bold since they denote program text. Also, this example does not seem to work: i(); // part of a two-line comment /\ / j(); // part of a two-line comment looks cause "i();" is not part of a two-line comment. ______________________________ Page 54, 6.2 Conversions conversion). The list in 6.2.1.5 summarizes the conversions | ^^^^^^^ 6.2.1.7 ______________________________ Page 54, 6.2.1.1 Characters and integers [#1] Every integral type has a integral conversion rank | ^ an ______________________________ Page 56, 6.2.1.3 Real floating and integral, Footnote 53 53. All pointers to character types are correctly aligned. In general, the concept correctly aligned is transitive: if a pointer to type A is correctly aligned for a ^^^^^^^^^^^^^^^^^ should be italics ______________________________ Page 70, 6.3.2.6 Compound literals | 2. In contrast, in | void f(void) | { | int *p; | /*...*/ | p = (int [2]){*p}; | /*...*/ The "..." should be in italics since they are inside a comment. ______________________________ Page 95, 6.5.2.1 Structure and union specifiers paragraph 5, and also footnote 95, "specified" should be "specifier" ______________________________ Page 103, 6.5.3.1 Formal definition of restrict 3. The file scope declarations | int * restrict a; | int * restrict b; | extern int c[]; | asset that if an object is referenced using the value | ^^^^^ assert of one of a, b, or c, then it is never references | ^^^^^^^^^^ referenced "asset" should be "assert" and "references" should be "referenced" ______________________________ Page 103, 6.5.3.1 Formal definition of restrict [#4] During each execution of B, let O be the array object that is determined dynamically by all references through pointer expressions based on P. Then all references of ^^ to values of O shall be through pointer expressions based on P. [[... Actually, this same typo appears in C9XD10, but it clearly is a deviation from N448 (the approved wording) where the word "to" is used. ...]] ______________________________ Pages 107-108, 6.5.4 Function-specifiers [[... format problem ...]] [#8] Any function with internal linkage can be an inline | function. For a function wtih external linkage, the following restrictions apply. If a function is declared | with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit | include the inline function specifier, then the definition in that translation unit is an inline definition. An inline | ^^^^^^^^^^^^^^^^^ italicize [[... in the postscript version of the Draft, "inline definition" should be in italics because it i a term that is being defined. ______________________________ Page 108, 6.5.4 Function-specifiers [[... typos ...] [#10] Note that the declarations of inline function fahr ^^^^^^^^^^^^ declaration result in the creation of an external definition, but the declaration of cels requires an external definition in ^^^^^^^^^^^ declarations another translation unit. [[... "declarations" should be "declaration" ...]] [[... "declaration" should be "declarations" ...]] ______________________________ Page 112, 6.5.5.2 Array declarators 3. extern int n; extern int m; void fcompat() { int a[n][6][m]; int (*p)[4][n+1]; | int c[n][n][6][m]; int (*r)[n][n][n+1]; p = a; // Error - not compatible because 4 != 6. r = c; // Compatible, but defined behavior // only if n==6 and m==n+1. | } In the postscript version, the "4 != 6" expresision should be in courier-bold font to match the "n==6" and "m==n+1" font. ______________________________ Page 118, 6.5.7 Type definitions 6. The size expression that is part of the variable length array type named by typedef name B is evaluated each time function copyt is entered. However, the | size of the variable length array type does not change if the value of n is subsequently changed. void copyt(int n) { typedef int B[n]; // B is n ints, n evaluated now.| n += 1; { B a; // a is n ints, n without += 1.| int b[n]; // a and b are different size| ^^^^ sizes for (i = 1; i < n; i++) a[i-1] = b[i]; } } "size" should be "sizes" in the above example ______________________________ Page 131, 6.6.5.3 paragraph 2, "ex-3" should be "expression-3". ______________________________ Page 132, 6.6.6.1 The goto statement 2. A goto statement is not allowed to jump past any | declarations of objects with variably modified types. A jump within the block, however, is permitted. goto lab3; // Error: going INTO scope of VLA. { double a[n]; a[j] = 4.4; lab3: a[j] = 3.3; | goto lab 4; // OK, going WITHIN scope of VLA. a[j] = 5.5; lab4: a[j] = 6.6; | } goto lab4; // Error: going INTO scope of VLA. It would be nice if the // comments lined up. ______________________________ Page 149, 6.8.3.3 The ## operator, paragraph 3: nonplacemarker is not a hyphenated word ______________________________ Page 157, 6.8.9 Pragma operator paragraph 1 "de-stringized" probably should be italicized rather than quoted, and not hyphenated preprocessing is not a hyphenated word (last sentence) "result from that execution" => "results" paragraph 2 "whether it appears literally as shown, or it results from" ^^ (remove erroneous 'it') ______________________________ Page 160, 7.1.2 Standard headers Add to the list in [2]. ______________________________ Page 240, 7.10.2.1 The longjmp function Examples [#6] The longjmp function that returns control back to the point of the setjmp invocation might cause memory associated with a variable length array object to be squandered. #include jmp_buf buf; void g(int n); void h(int n); int n = 6; void f(void) { int x[n]; // OK, f is not terminated. | setjmp(buf); g(n); } void g(int n) { int a[n]; // a may remain allocated. | h(n); | } void h(int n) { int b[n]; // b may remain allocated. | longjmp(buf,2); // might cause memory loss. } In the postscript version of this file the // comments do not line up ______________________________ Page 263, 7.13.6.1 The fprintf function In the e,E item in [6] the "e" is missing from the exponent in the style pattern. ______________________________ Page 471, footnote 293 has not text. Maybe the text is the text on page 462, which has no footnote. ______________________________ Page 464, footnote 292, the footnote is on page 464 the text is on page 465. ______________________________ Pages 260-300, 7.13.6 Formatted input/output functions, 7.13.7 Formatted input/output functions. The Formatted input/output functions have been duplicated, delete subclause 7.13.7 and renumber affected clauses, forward/cross references, and footnotes. Subsequent corrections which will need to be adjusted by this are marked (***). ______________________________ Page 403, 7.20.5 Mathematics The subclause can be removed, as this direction has already been taken. ______________________________ Page 313, 7.14.1.5 The strtod function In the last bullet in [3], replace "NaN" with "NAN". In [4], replace "NaN" with "NAN". ______________________________ Page 19, 5.2.2 Character display semantics, correct the forward reference for fputc to be 7.13.8.3 (***): ----> Forward references: the fputc function (7.13.7.3), the | ----> isprint function (7.3.1.7). | should be: Forward references: the isprint function (7.3.1.7), the fputc function (7.13.8.3). ______________________________ Page 33, 6.1.2.4 Storage durations of objects, correct the forward references ``variably modified (6.5.5)'' to be ``declarators (6.5.5)'', and ``variable length array (6.5.5.2)'' to be ``array declarators (6.5.5.2)'', forward reference always use the subclause title: ----> Forward references: compound statement, or block (6.6.2), | ----> function calls (6.3.2.3), variably modified (6.5.5), | ----> variable length array (6.5.5.2), initialization (6.5.8). should be: Forward references: compound statement, or block (6.6.2), function calls (6.3.2.3), declarators (6.5.5), array declarators (6.5.5.2), initialization (6.5.8). ______________________________ Page 43, 6.1.3.1 Floating constants, para 6, footnote 42 has the wrong subclause number for strtod: ----> 42. The specification for the library functions recommends ----> more accurate conversion than required for floating ----> constants. See strtod (7.15.1.5). | should be: 42. The specification for the library functions recommends more accurate conversion than required for floating constants. See strtod (7.14.1.5). ______________________________ Page 46, 6.1.3.4 Character constants, footnote 44 references the wrong subclause: ----> 44. See ``future language directions'' (6.9.2). | should be: 44. See ``future language directions'' (6.9.1). ______________________________ Page 74, 6.3.3.3 Unary arithmetic operators, correct the forward reference for limits and : ----> Forward references: limits and | ----> (7.1.6). should be: Forward references: limits and | (7.1.5). ______________________________ Page 74, 6.3.3.4 The sizeof operator, correct the forward reference for ``variable length array (6.5.5.2)'' to be ``array declarators (6.5.5.2)'', forward reference always use the subclause title: ----> Forward references: common definitions (7.1.6), | ----> declarations (6.5), structure and union specifiers | ----> (6.5.2.1), type names (6.5.6), variable length array | ----> (6.5.5.2). should be: Forward references: common definitions (7.1.6), declarations (6.5), structure and union specifiers (6.5.2.1), type names (6.5.6), array declarators (6.5.5.2). ______________________________ Page 79, 6.3.6 Additive operators, correct the forward reference for ``variable length array (6.5.5.2)'' to be ``array declarators (6.5.5.2)'', forward reference always use the subclause title: ----> Forward references: variable length array (6.5.5.2), common | ----> definitions (7.1.6). | should be: Forward references: array declarators (6.5.5.2), common definitions (7.1.6). ______________________________ Page 90, 9.4 Constant expression, correct the forward reference for ``variable length array (6.5.5.2)'' to be ``array declarators (6.5.5.2)'', forward reference always use the subclause title: ----> Forward references: variable length array (6.5.5.2), | ----> initialization (6.5.8). should be: Forward references: array declarators (6.5.5.2), initialization (6.5.8). ______________________________ Page 92, 6.5 Declarations, Forward references, correct ``initialization (6.5.6)'' to be ``initialization (6.5.8)'': ----> Forward references: declarators (6.5.5), enumeration | ----> specifiers (6.5.2.2), initialization (6.5.6), tags | ----> (6.5.2.3). should be: Forward references: declarators (6.5.5), enumeration specifiers (6.5.2.2), initialization (6.5.8), tags (6.5.2.3). ______________________________ Page 92, 6.5.1 Storage-class specifiers, correct footnote 91 to reference 6.9.2: ----> 91. See ``future language directions'' (6.9.3). | should be: 91. See ``future language directions'' (6.9.2). ______________________________ Page 101, 6.5.2.3 tags, correct the forward references ``variably modified (6.5.5)'' to be ``declarators (6.5.5)'', and ``variable length array (6.5.5.2)'' to be ``array declarators (6.5.5.2)'', forward reference always use the subclause title: ----> Forward references: variably modified (6.5.5), variable | ----> length array (6.5.5.2), type definitions (6.5.7). should be: Forward references: declarators (6.5.5), array declarators (6.5.5.2), type definitions (6.5.7). ______________________________ Page 110, 6.5.5 Declarators, correct the forward references ``variable length array (6.5.5.2)'' to be ``array declarators (6.5.5.2)'', forward reference always use the subclause title: ----> Forward references: variable length array (6.5.5.2), type | ----> definitions (6.5.7). should be: Forward references: array declarators (6.5.5.2), type definitions (6.5.7). ______________________________ Page 113, 6.5.5.3 Function declarators, correct footnote 109 to reference subclause 6.9.3: ----> 109. See ``future language directions'' (6.9.4). | should be: 109. See ``future language directions'' (6.9.3). ______________________________ Page 125, 6.5.8 Initialization, correct the forward reference for limits and : ----> Forward references: common definitions (7.1.5). | should be: Forward references: common definitions (7.1.6). ______________________________ Page 138, 6.7.1 Function definitions, correct footnote 122 to reference subclause 6.9.4: ----> 109. See ``future language directions'' (6.9.5). | should be: 109. See ``future language directions'' (6.9.4). ______________________________ Page 155, 6.8.6 Pragma directive, correct the forward reference for the CX_LIMITED_RANGE pragma: ----> Forward references: the FP_CONTRACT pragma (7.7.1), the | ----> FENV_ACCESS pragma (7.6.1), the CX_LIMITED_RANGE pragma | ----> (7.9.1). should be: Forward references: the FP_CONTRACT pragma (7.7.1), the | FENV_ACCESS pragma (7.6.1), the CX_LIMITED_RANGE pragma | (7.8.1). ______________________________ Page 171, 7.3.1.11 The isxdigit function, correct the reference ``hexadecimal-digit character (as defined in 6.1.3.2)'' to be ``hexadecimal-digit character (as defined in 6.1.3.1)'': ----> [2] The isxdigit function tests for any hexadecimal-digit ----> character (as defined in 6.1.3.2). | should be: [#2] The isxdigit function tests for any hexadecimal-digit character (as defined in 6.1.3.1). | ______________________________ Page 183, 7.5 Localization , correct footnote 150 to reference subclause ``7.20.4'': ----> 150. See ``future library directions'' (7.20.3). | should be: 150. See ``future library directions'' (7.20.4). ______________________________ Page , 7.7.9.3 The nearbyint function, para 2, correct the reference to ``rint function (7.7.10.4)'' to ``rint function (7.7.9.4)'': ----> [#2] The nearbyint function differs from the rint function | ----> (7.7.10.4) only in that the nearbyint function does not | ----> raise the inexact exception. (See F.9.6.3-F.9.6.4.) should be: [#2] The nearbyint function differs from the rint function (7.7.9.4) only in that the nearbyint function does not raise the inexact exception. (See F.9.6.3-F.9.6.4.) ______________________________ Page 183, 7.11.1.1 The signal function, correct footnote 188 to reference subclause ``7.20.6'': ----> 188. See ``future library directions'' (7.20.5). The names | ----> of the signal numbers reflect the following terms ----> (respectively): abort, floating-point exception, ----> illegal instruction, interrupt, segmentation violation, ----> and termination. should be: 188. See ``future library directions'' (7.20.6). The names of the signal numbers reflect the following terms (respectively): abort, floating-point exception, illegal instruction, interrupt, segmentation violation, and termination. ______________________________ Index: strtod function 7.14.1.4 NOTE: this is different than the references, the reference problem was 7.15.1.5 should be: strtod function 7.14.1.5 snprintf is missing vsnprintf is missing NOTE: The index needs to be checked. ########################################################################### Corrections to bring Annex B in sync with the rest of the standard: Missing, needs to be added (N717): (5.2.1) hex-quad: hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit universal-character-name: \u hex-quad \U hex-quad hex-quad ______________________________ (6.1.3.1) exponent-part entry appears twice, remove the duplicate: (6.1.3.1) exponent-part: | e sign-opt digit-sequence E sign-opt digit-sequence (6.1.3.1) exponent-part: | e sign-opt digit-sequence | E sign-opt digit-sequence | ______________________________ hexadecimal-digit is properly defined in 6.1.3.1, remove this duplicate: (6.1.3.2) hexadecimal-digit: one of | 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F ______________________________ Move universal-character-name from c-char-sequence to c-char, i.e. correct the following (N717): ---> (6.1.3.4) c-char-sequence: | ---> c-char ---> c-char-sequence c-char ---> universal-character-name | ---> ---> (6.1.3.4) c-char: | ---> any member of the source character set except ---> the single-quote ', backslash \, or new-line character ---> escape-sequence should be: (6.1.3.4) c-char-sequence: | c-char c-char-sequence c-char (6.1.3.4) c-char: | any member of the source character set except the single-quote ', backslash \, or new-line character escape-sequence universal-character-name | ______________________________ The following syntax is all misnumbered: ----> (6.5.4) declarator: | ----> (6.5.4) direct-declarator: | ----> (6.5.4) pointer: | ----> (6.5.4) type-qualifier-list: | ----> (6.5.4) parameter-type-list: | ----> (6.5.4) parameter-list: | ----> (6.5.4) parameter-declaration: | ----> (6.5.4) identifier-list: | ----> (6.5.5) type-name: | ----> (6.5.5) abstract-declarator: | ----> (6.5.5) direct-abstract-declarator: | ----> (6.5.6) typedef-name: | ----> (6.5.7) initializer: | ----> (6.5.7) initializer-list: | Renumber the above syntax as follows: (6.5.5) declarator: | (6.5.5) direct-declarator: | (6.5.5) pointer: | (6.5.5) type-qualifier-list: | (6.5.5) parameter-type-list: | (6.5.5) parameter-list: | (6.5.5) parameter-declaration: | (6.5.5) identifier-list: | (6.5.6) type-name: | (6.5.6) abstract-declarator: | (6.5.6) direct-abstract-declarator: | (6.5.7) typedef-name: | (6.5.8) initializer: | (6.5.8) initializer-list: | ______________________________ Add ``restrict'' to (6.5.3) type-qualifier: ----> (6.5.3) type-qualifier: | ----> const ----> volatile should be: (6.5.3) type-qualifier: | const restrict volatile ______________________________ Add the following missing syntax (N741): (6.5.4) function-specifier: inline ______________________________ Correct the following syntax, change ``constant-expr-opt'' to ``assignment-expression-opt'', and add ``direct-declarator [ * ]'' (N683): ----> (6.5.4) direct-declarator: | ----> identifier ----> ( declarator ) ----> direct-declarator [ constant-expr-opt ] ----> direct-declarator ( parameter-type-list ) ----> direct-declarator ( identifier-list-opt ) should be: (6.5.5) direct-declarator: | identifier ( declarator ) direct-declarator [ assignment-expression-opt ] direct-declarator [ * ] direct-declarator ( parameter-type-list ) direct-declarator ( identifier-list-opt ) ______________________________ Correct the following syntax, change ``constant-expr-opt'' to ``assignment-expression-opt'', and add ``direct-declarator [ * ]'' (N683). THIS IS NOT A DUPLICATE OF THE ABOVE CORRECTION: ----> (6.5.5) direct-abstract-declarator: | ----> ( abstract-declarator ) ----> direct-abstract-declarator-opt [ constant-expression-opt ] ----> direct-abstract-declarator-opt ( parameter-type-list-opt ) should be: (6.5.5) direct-abstract-declarator: | ( abstract-declarator ) direct-abstract-declarator-opt [ assignment-expression-opt ] direct-declarator [ * ] direct-abstract-declarator-opt ( parameter-type-list-opt ) ______________________________ Correct the following syntax, change ``initializer-list , initializer'' to ``initializer-list , designation-opt initializer'' and add designation, designator-list, and designator (N716): ----> (6.5.7) initializer-list: | ----> initializer ----> initializer-list , initializer should be: (6.5.8) initializer-list: designation-opt initializer initializer-list , designation-opt initializer (6.5.8) designation: designator-list = (6.5.8) designator-list: designator designator-list designator (6.5.8) designator: [ constant-expression ] . identifier ______________________________ Correct the following syntax as shown (N740): ----> (6.6.2) compound-statement: | ----> { declaration-list-opt statement-list-opt } ----> ----> (6.6.2) declaration-list: | ----> declaration ----> declaration-list declaration ----> ----> (6.6.2) statement-list: | ----> statement ----> statement-list statement should be: (6.6.2) compound-statement: { block-item-list-opt } (6.6.2) block-item-list: block-item block-item-list block-item (6.6.2) block-item: declaration statement ______________________________ Add missing ``for ( declaration ; expr-opt ; expr-opt ) statement to ``iteration-statement'' (N740): ----> (6.6.5) iteration-statement: | ----> while ( expression ) statement ----> do statement while ( expression ) ; ----> for ( expr-opt ; expr-opt ; expr-opt ) statement should be: (6.6.5) iteration-statement: while ( expression ) statement do statement while ( expression ) ; for ( expr-opt ; expr-opt ; expr-opt ) statement for ( declaration ; expr-opt ; expr-opt ) statement ______________________________ Add the following missing syntax (N707), two #define entries are missing: ----> (6.8.3) # define identifier lparen identifier-list-opt ) replacement-list new-line| ----> (6.8.3) # undef identifier new-line | should be: (6.8.3) # define identifier lparen identifier-list-opt ) replacement-list new-line| (6.8.3) # define identifier lparen ... ) replacement-list new-line| (6.8.3) # define identifier lparen identifier-list , ... ) replacement-list new-line| (6.8.3) # undef identifier new-line | ########################################################################### Corrections to bring Annex C in sync with the rest of the standard: Page 421, Annex C, para 2, bullet 3, correct the cross reference ``an initializer (6.5.7)'' to be ``an initializer (6.5.8)''. ______________________________ Page 421, Annex C, para 2, add a new bulleted subparagraph as the third bulleted paragraph as follows: __ The end of a full declarator: Declarators (6.5.5) ______________________________ After applying the above two corrections Annex C paragraph 2 should read: That is: - The call to a function, after the arguments have been - The call to a function, after the arguments have been evaluated (6.3.2.3). - The end of the first operand of the following operators: logical AND && (6.3.13); logical OR || (6.3.14); conditional ? (6.3.15); comma , (6.3.17). - The end of a full declarator: Declarators (6.5.5) - The end of a full expression: an initializer (6.5.8); the expression in an expression statement (6.6.3); the controlling expression of a selection statement (if or switch) (6.6.4); the controlling expression of a while or do statement (6.6.5); each of the three expressions of a for statement (6.6.5.3); the expression in a return statement (6.6.6.4). - Immediately before a library function return (7.1.8). ########################################################################### ########################################################################### One question about the annex updates, and that is: Should the STDC pragmas like: #pragma STDC FENV_ACCESS on-off-switch be listed in Annex D? There was nothing like them in C89. My comments below suggests it should be. ########################################################################### Corrections to bring Annex D in sync with the rest of the standard: Page 422, Annex D, para 1, before D.3 Diagnostics , add and renumber all subsequent subclauses of D: D. Boolean type and values bool true false __bool_true_false_are_defined ______________________________ Page 423, Annex D, para 1, before D.5 Localization , add and renumber all subsequent subclauses of D: D. Integral types int8_t int16_t int32_t int64_t uint8_t uint16_t uint32_t uint64_t intmax_t uintmax_t intptr_t uintptr_t intfast_t uintfast_t int_least8_t int_least16_t int_least32_t int_least64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t INT8_MIN INT16_MIN INT32_MIN INT64_MIN INT8_MAX INT16_MAX INT32_MAX INT64_MAX UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX INTFAST_MIN INTFAST_MAX UINTFAST_MAX INTMAX_MIN INTMAX_MAX UINTMAX_MAX INTPTR_MAX UINTPTR_MAX INT8_C(c) INT16_C(c) INT32_C(c) INT64_C(c) UINT8_C(c) UINT16_C(c) UINT32_C(c) UINT64_C(c) INTMAX_C(c) UINTMAX_C(c) PRId8 PRId16 PRId32 PRId64 PRIdLEAST8 PRIdLEAST16 PRIdLEAST32 PRIdLEAST64 PRIdFAST8 PRIdFAST16 PRIdFAST32 PRIdFAST64 PRIi8 PRIi16 PRIi32 PRIi64 PRIiLEAST8 PRIiLEAST16 PRIiLEAST32 PRIiLEAST64 PRIiFAST8 PRIiFAST16 PRIiFAST32 PRIiFAST64 PRIo8 PRIo16 PRIo32 PRIo64 PRIoLEAST8 PRIoLEAST16 PRIoLEAST32 PRIoLEAST64 PRIoFAST8 PRIoFAST16 PRIoFAST32 PRIoFAST64 PRIx8 PRIx16 PRIx32 PRIx64 PRIxLEAST8 PRIxLEAST16 PRIxLEAST32 PRIxLEAST64 PRIxFAST8 PRIxFAST16 PRIxFAST32 PRIxFAST64 PRIX8 PRIX16 PRIX32 PRIX64 PRIXLEAST8 PRIXLEAST16 PRIXLEAST32 PRIXLEAST64 PRIXFAST8 PRIXFAST16 PRIXFAST32 PRIXFAST64 PRIu8 PRIu16 PRIu32 PRIu64 PRIuLEAST8 PRIuLEAST16 PRIuLEAST32 PRIuLEAST64 PRIuFAST8 PRIuFAST16 PRIuFAST32 PRIuFAST64 SCNd16 SCNd32 SCNd64 SCNi16 SCNi32 SCNi64 SCNo16 SCNo32 SCNo64 SCNu16 SCNu32 SCNu64 SCNx16 SCNx32 SCNx64 PRIdMAX PRIoMAX PRIxMAX PRIuMAX SCNiMAX SCNdMAX SCNoMAX SCNxMAX PRIdFAST PRIoFAST PRIxFAST PRIuFAST SCNiFAST SCNdFAST SCNoFAST SCNxFAST PRIdPTR PRIoPTR PRIxPTR PRIXPTR PRIuPTR SCNiPTR SCNdPTR SCNoPTR SCNxPTR intmax_t strtoimax(const char * restrict nptr, char ** restrict endptr, int base); intmax_t strtoumax(const char * restrict nptr, char ** restrict endptr, int base); D. Floating-point environment fenv_t fexcept_t FE_INEXACT FE_DIVBYZERO FE_UNDERFLOW FE_OVERFLOW FE_INVALID FE_ALL_EXCEPT FE_TONEAREST FE_UPWARD FE_DOWNWARD FE_TOWARDZERO FE_DFL_ENV #pragma STDC FENV_ACCESS on-off-switch void feclearexcept(int excepts); void fegetexceptflag(fexcept_t *flagp, void feraiseexcept(int excepts); void fesetexceptflag(const fexcept_t *flagp, int excepts); int fetestexcept(int excepts); int fegetround(void); int fesetround(int round); void fegetenv(fenv_t *envp); int feholdexcept(fenv_t *envp); void fesetenv(const fenv_t *envp); void feupdateenv(const fenv_t *envp); ______________________________ Page 424, Annex D, para 1, D.6 Mathematics , add the following missing entries: float_t double_t INFINITY NAN FP_NAN FP_INFINITE FP_NORMAL FP_SUBNORMAL FP_ZERO FP_FAST_FMA FP_FAST_FMAF FP_FAST_FMAL FP_ILOGB0 FP_ILOGBNAN DECIMAL_DIG #pragma STDC FP_CONTRACT on-off-switch int signbit(real-floating x); ______________________________ Page 426, Annex D, para 1, D.7 Complex , add the following missing entry: _Complex_I ______________________________ Page 426, Annex D, para 1, before D.8 Nonlocal jumps , add and renumber all subsequent subclauses of D: D. Type-generic math acos asin atan acosh asinh atanh cos sin tan cosh sinh tanh exp log pow sqrt fabs atan2 cbrt ceil copysign erf erfc exp2 expm1 fdim floor fmax fmin fmod frexp gamma hypot ilogb ldexp lgamma llrint llround log10 log1p log2 logb lrint lround nearbyint nextafter nextafterx remainder remquo rint round scalb scalbn scalbln trunc fma ______________________________ Page 427, Annex D, para 1, D.10 Variable arguments , add the following missing entry: void va_copy(va_list dest, va_list src); ______________________________ Page 427, Annex D, para 1, D.11 Input/output , there is random lines of prototype following the fflush entry, replace it with the correct definitions of fopen and freopen which are missing: ----> int fflush(FILE *stream); ----> const char * restrict mode, | ----> FILE * restrict stream); | ----> void setbuf(FILE * restrict stream, | ----> char * restrict buf); | should be: int fflush(FILE *stream); const char * restrict mode, FILE * restrict stream); FILE *fopen(const char *filename, const char *mode); FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream); void setbuf(FILE * restrict stream, char * restrict buf); ______________________________ Page 429, Annex D, para 1, D.11 Input/output , add the following missing entry: long int ftell(FILE *stream); ______________________________ Page 430, Annex D, para 1, D.12 General utilities , add the following missing entry: lldiv_t ______________________________ Page 430, Annex D, para 1, D.12 General utilities , remove the extraneous entries for strtod strtol and strtol, and add the missing entries for atol, atoll, strtof, strtold, strtoll: ----> double atof(const char *nptr); ----> strtod(nptr, (char **)NULL) | ----> int atoi(const char *nptr); ----> (int)strtol(nptr, (char **)NULL, 10) | ----> strtol(nptr, (char **)NULL, 10) | ----> double strtod(const char * restrict nptr, | ----> char ** restrict endptr); | ----> char ** restrict endptr); | ----> char ** restrict endptr); | ----> char ** restrict endptr, int base); | ----> ----> char ** restrict endptr, int base); | ----> unsigned long int strtoul( | ----> const char * restrict nptr, | ----> char ** restrict endptr, | ----> int base); should be: double atof(const char *nptr); int atoi(const char *nptr); long int atol(const char *nptr); long long int atoll(const char *nptr); double strtod(const char * restrict nptr, char ** restrict endptr); float strtof(const char * restrict nptr, char ** restrict endptr); long double strtold(const char * restrict nptr, char ** restrict endptr); long int strtol(const char * restrict nptr, char ** restrict endptr, int base); unsigned long int strtoul( const char * restrict nptr, char ** restrict endptr, int base); ______________________________ Page 431, Annex D, para 1, D.12 General utilities , remove the extraneous line following the entry for ``div''. Remove the extraneous line following ``mblen'' containing ``mbtowc'', don't confuse this with the correct entry for ``mbtowc'' which follows two lines after ``mblen''. Add the missing entries for labs, llabs, ldiv, lldiv: ----> int abs(int j); ----> div_t div(int numer, int denom); ----> long long int denom); | ----> int mblen(const char *s, size_t n); ----> mbtowc((wchar_t *)0, s, n); | ----> int mbtowc(wchar_t * restrict pwc, | ----> const char * restrict s, | ----> size_t n); | ----> int wctomb(char *s, wchar_t wchar); should be: int abs(int j); div_t div(int numer, int denom); long int labs(long int j); long long int llabs(long long int j); ldiv_t ldiv(long int numer, long int denom); lldiv_t lldiv(long long int numer, long long int denom); int mblen(const char *s, size_t n); int mbtowc(wchar_t * restrict pwc, const char * restrict s, size_t n); int wctomb(char *s, wchar_t wchar); ______________________________ Page 433, Annex D, para 1, D.14 Date and time , correct strftime to show the restrict qualifiers: ----> struct tm *localtime(const time_t *timer); ----> size_t strftime(char *s, size_t maxsize, ----> const char *format, const struct tm *timeptr); should be: struct tm *localtime(const time_t *timer); size_t strftime(char * restrict s, size_t maxsize, const char * restrict format, const struct tm * restrict timeptr); ______________________________ Page 434, Annex D, para 1, D.17.1 Formatted wide-character input/output functions, all of the functions in this subclause are incorrectly specified. They are missing the restrict qualifiers. In addition the functions vfwscanf, vwscanf, vswscanf are missing: ----> int fwprintf(FILE *stream, const wchar_t *format, ...); ----> int fwscanf(FILE *stream, const wchar_t *format, ...); ----> int wprintf(const wchar_t *format, ...); ----> int wscanf(const wchar_t *format, ...); ----> int swprintf(wchar_t *s, size_t n, const wchar_t *format, ...); ----> int swscanf(const wchar_t *s, const wchar_t *format, ...); ----> int vfwprintf(FILE *stream, const wchar_t *format, va_list arg); ----> int vwprintf(const wchar_t *format, va_list arg); ----> int vswprintf(wchar_t *s, size_t n, const wchar_t *format, ----> va_list arg); should be: int fwprintf(FILE * restrict stream, const wchar_t * restrict format, ...); int fwscanf(FILE * restrict stream, const wchar_t * restrict format, ...); int wprintf(const wchar_t * restrict format, ...); int wscanf(const wchar_t * restrict format, ...); int swprintf(wchar_t * restrict s, size_t n, const wchar_t * restrict format, ...); int swscanf(const wchar_t * restrict s, const wchar_t * restrict format, ...); int vfwprintf(FILE * restrict stream, const wchar_t * restrict format, va_list arg); int vwprintf(const wchar_t * restrict format, va_list arg); int vswprintf(wchar_t * restrict s, size_t n, const wchar_t * restrict format, va_list arg); int vfwscanf(FILE * restrict stream, const wchar_t * restrict format, va_list arg); int vwscanf(FILE * restrict stream, const wchar_t * restrict format, va_list arg); int vswscanf(const wchar_t * restrict s, const wchar_t * restrict format, va_list arg); ______________________________ Page 435, Annex D, para 1, D.17.2 Wide-character input/output functions, the following functions have been incorrectly placed in this subclause remove them. ----> int fwprintf(FILE * restrict stream, | ----> const wchar_t * restrict format, ...); | ----> int wprintf(const wchar_t * restrict format, ...); | ----> int wscanf(const wchar_t * restrict format, ...); | ----> int swprintf(wchar_t * restrict s, | ----> size_t n, | ----> const wchar_t * restrict format, ...); | ----> int swscanf(const wchar_t * restrict s, | ----> const wchar_t * restrict format, ...); | ----> int vfwprintf(FILE * restrict stream, | ----> const wchar_t * restrict format, | ----> va_list arg); | ----> int vwprintf(const wchar_t * restrict format, | ----> va_list arg); | ----> int vswprintf(wchar_t * restrict s, | ----> size_t n, | ----> const wchar_t * restrict format, | ----> va_list arg); | ----> int vfwscanf(FILE * restrict stream, | ----> const wchar_t * restrict format, | ----> va_list arg); | ----> int vwscanf(FILE * restrict stream, | ----> const wchar_t * restrict format, | ----> va_list arg); | ----> int vswscanf(const wchar_t * restrict s, | ----> const wchar_t * restrict format, | ----> va_list arg); | NOTE: These functions were intended to appear in D.17.1 Formatted wide-character input/output functions. However, moving them to D.17.1 will not result in fixing the errors in D.17.1, because this list of functions is missing the function fwscanf. The immediately preceding correction fixes D.17.1. ______________________________ Page 436, Annex D, para 1, D.17.3 Wide-string numeric conversion functions, remove the duplicate and incorrect first entry for wcstoul, and replace it with the missing entry for wcstof: ----> double wcstod(const wchar_t *nptr, wchar_t **endptr); ----> unsigned long int wcstoul(const wchar_t *nptr, wchar_t **endptr,* ----> int base); ----> long double wcstold( | ----> const wchar_t * restrict nptr, | ----> wchar_t ** restrict endptr); | should be: double wcstod(const wchar_t *nptr, wchar_t **endptr); float wcstof( const wchar_t * restrict nptr, wchar_t ** restrict endptr); long double wcstold( const wchar_t * restrict nptr, wchar_t ** restrict endptr); ______________________________ Page 436, Annex D, para 1, D.17.4 Wide-string functions, replace the errant lines following the wcsncmp function with the definition of the wcsxfrm function. And add the missing functions wcschr, wcscspn, wcspbrk, wcsrchr, wcsspn, wcsstr, wcstok, wcslen: ----> int wcsncmp(const wchar_t *s1, const wchar_t *s2, | ----> size_t n); | ----> const wchar_t * restrict s2, | ----> size_t n); | ----> wchar_t *wmemchr(const wchar_t *s, wchar_t c, | ----> size_t n); | should be: int wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n); size_t wcsxfrm(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n); wchar_t *wcschr(const wchar_t *s, wchar_t c); size_t wcscspn(const wchar_t *s1, const wchar_t *s2); wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2); wchar_t *wcsrchr(const wchar_t *s, wchar_t c); size_t wcsspn(const wchar_t *s1, const wchar_t *s2); wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2); wchar_t *wcstok(wchar_t * restrict s1, const wchar_t * restrict s2, wchar_t ** restrict ptr); size_t wcslen(const wchar_t *s); wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n); ______________________________ Page 436, Annex D, para 1, D.17.6 Extended multibyte/wide-character conversion functions, replace the functions mbrlen, mbrtowc, wcrtomb, mbsrtowcs and wcsrtombs with the correct versions showing the restrict qualifiers: ----> int mbsinit(const mbstate_t *ps); ----> size_t mbrlen(const char *s, size_t n, mbstate_t *ps); ----> size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, ----> mbstate_t *ps); ----> size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps); ----> size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, ----> mbstate_t *ps); ----> size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, ----> mbstate_t *ps); should be: int mbsinit(const mbstate_t *ps); size_t mbrlen(const char * restrict s, size_t n, mbstate_t * restrict ps); size_t mbrtowc(wchar_t * restrict pwc, const char * restrict s, size_t n, mbstate_t * restrict ps); size_t wcrtomb(char * restrict s, wchar_t wc, mbstate_t * restrict ps); size_t mbsrtowcs(wchar_t * restrict dst, const char ** restrict src, size_t len, mbstate_t * restrict ps); size_t wcsrtombs(char * restrict dst, const wchar_t ** restrict src, size_t len, mbstate_t * restrict ps); ########################################################################### ########################################################################### Corrections to bring Annex E in sync with the rest of the standard: Page 439, Annex E, para 1, add the missing entries for LLONG_MIN, LLONG_MAX and ULLONG_MAX: ----> #define CHAR_BIT 8 ----> #define CHAR_MAX UCHAR_MAX or SCHAR_MAX ----> #define CHAR_MIN 0 or SCHAR_MIN ----> #define INT_MAX +32767 ----> #define INT_MIN -32767 ----> #define LONG_MAX +2147483647 ----> #define LONG_MIN -2147483647 ----> #define MB_LEN_MAX 1 ----> #define SCHAR_MAX +127 ----> #define SCHAR_MIN -127 ----> #define SHRT_MAX +32767 ----> #define SHRT_MIN -32767 ----> #define UCHAR_MAX 255 ----> #define UINT_MAX 65535 ----> #define ULONG_MAX 4294967295 ----> #define USHRT_MAX 65535 should be: #define CHAR_BIT 8 #define CHAR_MAX UCHAR_MAX or SCHAR_MAX #define CHAR_MIN 0 or SCHAR_MIN #define INT_MAX +32767 #define INT_MIN -32767 #define LLONG_MAX +9223372036854775807 #define LLONG_MIN -9223372036854775807 #define LONG_MAX +2147483647 #define LONG_MIN -2147483647 #define MB_LEN_MAX 1 #define SCHAR_MAX +127 #define SCHAR_MIN -127 #define SHRT_MAX +32767 #define SHRT_MIN -32767 #define UCHAR_MAX 255 #define UINT_MAX 65535 #define ULLONG_MAX 18446744073709551615 #define ULONG_MAX 4294967295 #define USHRT_MAX 65535 ______________________________ Page 439, Annex E, para 2, add the missing entry for FLT_EVAL_METHOD: ----> The components are described further in 5.2.4.2.2. ----> ----> #define FLT_ROUNDS ----> ----> [#3] The values given in the following list shall be replaced by should be: The components are described further in 5.2.4.2.2. #define FLT_EVAL_METHOD #define FLT_ROUNDS [#3] The values given in the following list shall be replaced by ########################################################################### N587 Page 163, 7.1.7 Boolean type and values , para 2: ----> int, and which is suitable to be used as the type of bit | ----> field. A bit field of any width and type bool shall be | should read: int, and which is suitable to be used as the type of a bit | field. A bit field of any width and type bool shall be | ``type of bit'' should be ``type of a bit''. ########################################################################### ########################################################################### N602 Page 180, 7.4.12.1 the strtoimax macro, para 1, add ``restrict'' to the ``nptr'' and ``endptr'' parameters, and a semicolon to the end of the definition: ----> intmax_t strtoimax(const char *nptr, char **endptr, int base)| should read: intmax_t strtoimax(const char * restrict nptr, char ** restrict endptr, int base); ______________________________ Page 181, 7.4.12.1 the strtoumax macro, para 1 add ``restrict'' to the ``nptr'' and ``endptr'' parameters, and a semicolon to the end of the definition: ----> uintmax_t strtoumax(const char *nptr, char **endptr, int base)| should read: intmax_t strtoumax(const char * restrict nptr, char ** restrict endptr, int base); ########################################################################### ########################################################################### N611 Page 63, 6.3.2.1 The identifier __func__: N611 called for the __func__ subclause to be a subclause of 6.3.1 Primary expressions, numbered 6.3.1.1. For some inexplicable reason it has been added as a subclause of 6.3.2 Postfix operators, i.e. 6.3.2.1. __func__ is not a Postfix operator. Make the following corrections: Move clause ``6.3.2.1 The identifier __func__'' to ``6.3.1.1 The identifier __func__''. Renumber clauses ``6.3.2.2'' thru ``6.3.2.6'' as ``6.3.2.1'' thru ``6.3.2.5'' respectively. Correct all cross/forward references to these numbered subclauses. ______________________________ Page 63, 6.3.2.1 The identifier __func__, the indicated sentence below is missing from the end of paragraph 1: ----> appeared, where function-name is the name of the lexically- | ----> enclosing function.64 | should read: appeared, where function-name is the name of the lexically- enclosing function.64 This name is the unadorned name of the function, without extraneous linkage characters (such as leading underscores) or trailing parentheses. ______________________________ DO NOT MAKE THIS CHANGE IF THE ABOVE SUBCLAUSE RENUMBERING CORRECTION IS MADE: Page 39, 6.1.2.7 Predefined identifiers, Forward references, correct 6.3.1.1 to be 6.3.2.1: ----> Forward references: the identifier __func__ (6.3.1.1). should be: Forward references: the identifier __func__ (6.3.2.1). ########################################################################### ########################################################################### N671 Page 244, 7.12.1 Variable argument list access macros, para 1, remove the words ``as actual'': ----> this subclause shall be implemented as macros, not as actual ----> functions. It is unspecified whether va_end is a macro or should be: this subclause shall be implemented as macros, not functions. It is unspecified whether va_end is a macro or ########################################################################### ########################################################################### N675 Page 145, 6.8.1 Conditional inclusion, the example in the proposal as approved by the committee is missing. Add the following example to subclause 6.8.1 after paragraph 6. Subclause 6.8.1 does not currently have any examples: Examples In: #define EMPTY EMPTY # include the sequence of preprocessing tokens on the second line is *not* a preprocessing directive, because it does not begin with a # at the start of translation phase 4, even though it will do so after the macro /EMPTY/ has been replaced. ########################################################################### ########################################################################### N682 Page 102, 6.5.3 Type qualifiers, para 7, third sentence change ``allocated the pointer'' to ``allocated object and the pointer'': ----> to a single pointer establishes this association between the | ----> allocated the pointer. The intended use of the restrict | should be: to a single pointer establishes this association between the allocated object and the pointer. The intended use of the restrict ______________________________ Pages 104-105, 6.5.3.1 Formal definition of restrict, para 7 and 8 must be moved to 6.5.3 Type qualifiers to follow exiting paragraphs 7 of 6.5.3 as new paragraphs 8 and 9: In 6.5.3: ----> from a conforming program does not change its meaning (i.e., | ----> observable behavior). | ----> ----> Examples | should be: from a conforming program does not change its meaning (i.e., | observable behavior). | [#8] If the specification of an array type includes any type qualifiers, the element type is so-qualified, not the array type. If the specification of a function type includes any type qualifiers, the behavior is undefined.104 [#9] For two qualified types to be compatible, both shall have the identically qualified version of a compatible type; the order of type qualifiers within a list of specifiers or qualifiers does not affect the specified type. __________ 104. Both of these can only occur through the use of typedefs. Examples | AND In 6.5.3.1: ----> [#6] A translator is free to ignore any or all aliasing ----> implications of uses of restrict. ----> ----> [#7] If the specification of an array type includes any type ----> qualifiers, the element type is so-qualified, not the array ----> type. If the specification of a function type includes any ----> type qualifiers, the behavior is undefined.104 ----> ----> ----> __________ ----> ----> 104. Both of these can only occur through the use of ----> typedefs. ----> ----> [#8] For two qualified types to be compatible, both shall ----> have the identically qualified version of a compatible type; ----> the order of type qualifiers within a list of specifiers or ----> qualifiers does not affect the specified type. ----> ----> Examples ----> ----> [#9] ----> ----> 1. The following examples show restricted pointers used * ----> as function parameters: ----> ----> float x[100]; ----> float *c; ----> ----> void f(int n, float *restrict a, float *const b) ----> { ----> int i; ----> for (i = 0; i < n; i++ ) ----> a[i] = b[i] + c[i]; ----> } ----> void g(void) ----> { ----> static float d[100], e[100]; ----> c = x; ----> f(100, d, e); /* defined behavior */ ----> f( 50, d, d+50); /* defined behavior */ ----> f( 99, d+1, d); /* undefined behavior */ ----> c = d; ----> f( 99, d+1, e); /* undefined behavior */ ----> f( 99, e, d+1); /* defined behavior */ ----> } ----> ----> 2. The following are examples of restricted pointer ----> assignment that are undefined behavior: ----> ----> int *restrict p1, *restrict p2; ----> void f (int *restrict q1, int *restrict q2) ----> { ----> p1 = p2; /* undefined behavior */ ----> p1 = q1; /* undefined behavior */ ----> p1 = q2; /* undefined behavior */ ----> { ----> int *restrict r1, *restrict r2; ----> /* ... */ ----> r1 = r2; /* undefined behavior */ ----> q1 = r1; /* undefined behavior */ ----> p1 = r1; /* undefined behavior */ ----> } ----> } ----> ----> 3. The file scope declarations | should be: [#6] A translator is free to ignore any or all aliasing implications of uses of restrict. 3. The file scope declarations | ______________________________ Page 106, 6.5.3.1 Formal definition of restrict, para 9, example 4, correct ``fload'' to be ``float'': ----> { | ----> extern fload d[100]; | ----> f(50, d+50, d); // defined behavior | should be: { extern float d[100]; f(50, d+50, d); // defined behavior ______________________________ Page 106, 6.5.3.1 Formal definition of restrict, para 9, example 5, correct ``imply'' to be ``simply'' and remove the extraneous ``, b'': ----> show how const can be used in conjunction with | ----> restrict. The const qualifier imply, without the need | ----> to examine the body of h, that q and r cannot become | ----> based on p. The fact that p is restrict-qualified | ----> therefore implies that an object referenced through p | ----> is never referenced through either of q or r. This is | ----> the precise assertion required to optimized the loop. | ----> Note that a call of the form h(100, a, b, b, b) has | ----> defined behavior, which would not be true if all three | should be: show how const can be used in conjunction with restrict. The const qualifier simply, without the need to examine the body of h, that q and r cannot become based on p. The fact that p is restrict-qualified therefore implies that an object referenced through p is never referenced through either of q or r. This is the precise assertion required to optimized the loop. Note that a call of the form h(100, a, b, b) has defined behavior, which would not be true if all three ______________________________ Page 107, 6.5.3.1 Formal definition of restrict, para 9, example 6, correct ``nalloc'' to be ``malloc'': ----> t.n = n; | ----> t.v = nalloc(n * sizeof(float)); | ----> return t; | should be: t.n = n; t.v = malloc(n * sizeof(float)); return t; ########################################################################### ########################################################################### N683 Page 74, 6.3.3.4 The sizeof operator, para 5, correct example 3. ``fsize'' should be ``fsize3'', ``size_t n'' should be ``int n'', add a ``return 0;'' to the function ``main'', add the inclusion of sence "size_t" is used, also the // comments should be aligned: ----> 3. ----> ----> size_t fsize (size_t n) ----> { ----> char b[n+3]; // Variable length array. ----> return sizeof b; // Execution time sizeof. ----> } ----> int main() | ----> { ----> size_t size; ----> size = fsize3(10); // func returns 13. ----> } should be: 3. #include size_t fsize3 (int n) { char b[n+3]; // Variable length array. return sizeof b; // Execution time sizeof. } int main() | { size_t size; size = fsize3(10); // fsize3 returns 13. return 0; } ______________________________ Page 94, 6.5.2 Type specifiers, para 5, add the missing example from change #11 of N683. 6.5.2 does not currently have an examples section, one needs to be added as follows: Examples All declarations of variably modified (VM) types must be declared at either block scope or function prototype scope. Array objects declared with the "static" or "extern" storage class specifier cannot have a variable length array (VLA) type. However, a object declared with the "static" storage class specifier can have a VM type (that is, a pointer to a VLA type). Finally, all identifiers declared with a VM type must be ordinary identifiers, and can not, therefore, be members of structures or unions. extern int n; int A[n]; /* Error - file scope VLA */ extern int (*p2)[n]; /* Error - file scope VM */ int B[100]; /* OK - file scope but not VM */ void fvla(int m, int C[m][m]) { /* OK - VLA with prototype scope */ typedef int VLA[m][m]; /* OK - block scope typedef VLA */ /* array size m evaluated now */ struct tag { int (*y)[n]; /* Error - y is not an ordinary identifier */ int z[n]; /* Error - z is not an ordinary identifier */ }; int D[m]; /* OK - auto VLA */ static int E[m]; /* Error - static block scope VLA */ extern int F[m]; /* Error - F has linkage and is a VLA */ int (*s)[m]; /* OK - auto pointer to VLA */ extern int (*r)[m]; /*Error - r has linkage and is a pointer to VLA*/ static int (*q)[m] = &B; /* OK - q is a static block scope pointer to VLA */ /* ... */ } ______________________________ Page 109, 6.5.5 Declarators, para 1, correct the ``direct-declarators'' syntax, change ``constant-expr-opt'' to ``assignment-expression-opt'', and add ``direct-declarator [ * ]'': ----> direct-declarator: ----> identifier ----> ( declarator ) ----> direct-declarator [ constant-expr-opt ] ----> direct-declarator ( parameter-type-list ) ----> direct-declarator ( identifier-list-opt ) should be: direct-declarator: identifier ( declarator ) direct-declarator [ assignment-expression-opt ] direct-declarator [ * ] direct-declarator ( parameter-type-list ) direct-declarator ( identifier-list-opt ) ______________________________ Page 115, 6.5.6 Type names, para 1, correct the ``direct-abstract-declarator'' syntax, change ``constant-expr-opt'' to ``assignment-expression-opt'', and add ``direct-declarator [ * ]'': ----> direct-abstract-declarator: | ----> ( abstract-declarator ) ----> direct-abstract-declarator-opt [ constant-expression-opt ] ----> direct-abstract-declarator-opt ( parameter-type-list-opt ) should be: direct-abstract-declarator: ( abstract-declarator ) direct-abstract-declarator-opt [ assignment-expression-opt ] direct-declarator [ * ] direct-abstract-declarator-opt ( parameter-type-list-opt ) ______________________________ These last two syntax changes also apply to Annex B as noted with the corrections for Annex B. ########################################################################### ########################################################################### N691 Page 40, 6.1.2.8.2 Integral types, para 3, change ``(see above).'' to a footnote reference ``.41'': ----> [#3] The values of any padding bits are unspecified (see ----> above). A valid (non-trap) object representation of a should read: [#3] The values of any padding bits are unspecified.41 A valid (non-trap) object representation of a ########################################################################### ########################################################################### N693 Page 235, 7.9.1 Type-generic macros, para 3, remove the text ``For example'' and recapitalize sentence. ----> both functions) has the same name as the function in | ----> . For example, the corresponding type-generic macro ----> for fabs and cabs is fabs. * should be: both functions) has the same name as the function in . The corresponding type-generic macro for fabs and cabs is fabs. ______________________________ Page 236, 7.9.1 Type-generic macros, para 5, correct the spelling of ``scalbnl'' to ``scalbln'' in the list of type-generic macros. ----> scalbnl trunc | should be: scalbln trunc ______________________________ Page 275, 7.9.1 Type-generic macros In the second sentence in [3], change "For example, the corresponding ..." to "The corresponding ...". ______________________________ Page 475, G.6 [2] The table is of formulas, not program text. Same issue on Page 469 [6] and [7]. ########################################################################### ########################################################################### N657 items 6, 9, 11-14 Pages 465-468, G.4.1 Multiplicative operators Paragraph numbering is still strange. Both examples including the commentary on example 1 are in [6] but the commentary on example 2 is in [7]. Throughout G.5 I think for the special-case bullets regular style NaN is better than program style NAN, because the assertions are about all NaNs not just the NAN macro defined in . ########################################################################### ########################################################################### N694 Page 156, 6.8.8 Predefined macro names, para 2, for __STDC_IEC_559_COMPLEX__ change ``conformance'' to ``adherence''. ----> __STDC_IEC_559_COMPLEX__ The decimal constant 1, intended to | ----> indicate conformance to the | ----> specifications in informative Annex | ----> G (IEC 559 compatible complex | ----> arithmetic). should read: __STDC_IEC_559_COMPLEX__ The decimal constant 1, intended to indicate adherence to the specifications in informative Annex G (IEC 559 compatible complex arithmetic). ______________________________ Page 225, 7.7.14.1 The fma function, para 1, removed the line containing ``isunordered'' from the synopsis: ----> [#1] | ----> ----> #include | ----> double fma(double x, double y, double z); | ----> int isunordered(real-floating x, real-floating y); | ----> ----> Description | should be: [#1] | #include | double fma(double x, double y, double z); | Description | ______________________________ Page 226, 7.8 Complex arithmetic , para 2 remove ``types as specified in G.3'' and add the missing footnote as indicated below. Also add a another missing footnote, 181 as indicated below: ----> is defined if and only if the implementation supports | ----> imaginary types as specified in G.3; it expands to an | ----> expression of type const float imaginary, with the value of | ----> the imaginary unit. should be: is defined if and only if the implementation supports | imaginary*; it expands to an expression of type const float imaginary, with the value of the imaginary unit. 181. The imaginary unit is a number such that i*i = -1. *. A specification for imaginary types is in informative Annex G. ______________________________ Page 236, 7.9.1 Type-generic macros, para 5, add fma to the list of type-generic macros: ----> floor fmax fmin should be: floor fma fmax fmin ______________________________ Page 448, F.8.2 Expression transformations Reformat the second item from 1 * x,x / 1 --> x ....... ....... to 1 * x --> x ....... x / 1 --> x ....... (As is it looks like a comma expression.) ______________________________ Page 449, F.8.2 Expression transformations, para 1, correct the entry for ``0 * x --> 0.0'', by changing ``negative-signed'' to ``-0'': ----> 0 * x -> 0.0 The expressions 0 * x and 0.0 are not ----> equivalent if x is a NaN, infinite, or | ----> negative-signed. should be: 0 * x -> 0.0 The expressions 0 * x and 0.0 are not equivalent if x is a NaN, infinite, or -0. ______________________________ Page 451, F.9 In [2] change "infinities" to "infinity". ______________________________ Page 458, F.9.4.5 The cbrt function Replace the two bullets with the one * cbrt(x) returns x if x is +/-Inf or +/-0 ______________________________ Page 460, F.9.6.4 The rint function Replace the two bullets with the one * rint(x) returns x if x is +/-Inf or +/-0 (for all rounding directions). ______________________________ Page 462, F.9.y.1, Floating multiply-add is missing and needs to be added. It can be found on page 76 of the pre-london mailing, page 4 of N694, and is repeated here: F.9.y Floating multiply-add fma(x, y, z) computes the sum z plus the product x times y, correctly rounded once. . fma(x, y, z) returns one of its NaN arguments and raises no exception if x or y is a NaN. . fma(x, y, z) returns a NaN and optionally raises the invalid exception if one of x and y is infinite, the other is zero, and z is a NaN. . fma(x, y, z) returns a NaN and raises the invalid exception if one of x and y is infinite, the other is zero, and z is not a NaN . fma(x, y, z) returns a NaN and raises the invalid exception if x times y is an exact infinity and z is also an infinity but with the opposite sign. ______________________________ Page 462, footnote 291 The first part is MIA. ______________________________ Page 463, G.1 Introduction, para 1, add a second sentence as shown: ----> [#1] This annex supplements Annex F to specify complex arithmetic ----> for compatibility with IEC 559 real floating-point arithmetic. | should be: [#1] This annex supplements Annex F to specify complex arithmetic for compatibility with IEC 559 real floating-point arithmetic. An implementation supports this specification if and only if it defines the macro __STDC_IEC_559_COMPLEX__. ______________________________ The rest of the problems match those found by Jim, will not repeat them here. Pages 226, 156, 463, 225. ______________________________ Page 226, 7.8 Complex arithmetic [2] Footnote 181 is missing. It should say The imaginary unit is a number i such that i*i = -1. Also, a change from the minutes is missing: change "supports imaginary types as specified in G.3" to "supports imaginary types [182]" where footnote [182] is A specification of imaginary types is in informative Annex G. Append to paragraph [2] the sentence: The macros are suitable for use in constant expressions. ______________________________ Page 156, 6.8.8 Predefined macro names [2] In the __STDC_IEC_559_COMPLEX item, replace "conformance" with "adherence". ______________________________ Page 463, G.1 Introduction To paragraph [1] append the sentence An implementation supports this specification if it defines the macro __STDC_IEC_559_COMPLEX__. ______________________________ Page 225, 7.7.14.1 The fma function Remove the line about isunordered from the Synopsis. ______________________________ Page 225, 7.7.14 Floating multiply-add Move the entire subclause to before 7.7.13. I.e. interchange 7.7.13 and 7.7.14. ______________________________ Page 469, G.5 In [5] replace "7.9.2" with "7.8.2". Not part of N694, but in the area ... Page 464, G.4.1 Multiplicative operators The table in [2] is hard to read. I think the entries could be in formula style, not program style; if so, use italic i for I. Page 468, G.4.2 Additive operators Ditto ########################################################################### ########################################################################### N698 Page 36, 6.1.2.5 Types, para 19, the sentence beginning `` The precision of an integral type ...'' has been incorrectly placed as the penultimate sentence of this paragraph. This sentence was suppose to appear on page 40, 6.1.2.8.2 Integral types to form a new last paragraph following paragraph 4 of 6.1.2.8.2 Integral types. So on page 36, 6.1.2.5 Types, para 19, delete the sentence ``The precision of an integral type is the number of bits it uses to represent values excluding any sign and padding bits.'' ----> [#19] The type char, the signed and unsigned integer types, ----> and the enumerated types are collectively called integral ----> types. The integral and real floating types are ----> collectively called real types. The representations of ----> integral types shall define values by use of a pure binary ----> numeration system.33 The precision of an integral type is ----> the number of bits it uses to represent values excluding any | ----> sign and padding bits. The representations of real floating ----> types are unspecified. should read: [#19] The type char, the signed and unsigned integer types, and the enumerated types are collectively called integral types. The integral and real floating types are collectively called real types. The representations of integral types shall define values by use of a pure binary numeration system.33 The representations of real floating types are unspecified. AND on page 40, 6.1.2.8.2 Integral types, create a new paragraph 5 following paragraph 4 which reads ``The precision of an integral type is the number of bits it uses to represent values excluding any sign and padding bits.'' ----> [#4] Bit field types shall have no padding bits; an N-bit ----> bitfield shall have N value bits if treated as unsigned, and ----> N-1 value bits plus a sign bit if treated as signed. ----> ----> 6.1.3 Constants should read: [#4] Bit field types shall have no padding bits; an N-bit bitfield shall have N value bits if treated as unsigned, and N-1 value bits plus a sign bit if treated as signed. [#5] The precision of an integral type is the number of bits it uses to represent values excluding any sign and padding bits. 6.1.3 Constants ______________________________ Page 44, 6.1.3.2 Integer constants, paragraph 6 which begins `` If an integer constant can not be ...'' was suppose to be added as the last sentence of paragraph 5, not as a new paragraph: ----> [#5] The type of an integer constant is the first of the ----> corresponding list in which its value can be represented. ----> Unsuffixed decimal: int, long int, long long int; ----> unsuffixed octal or hexadecimal: int, unsigned int, long ----> int, unsigned long int, long long int, unsigned long long ----> int; suffixed by the letter u or U: unsigned int, unsigned ----> long int, unsigned long long int; decimal suffixed by the ----> letter l or L: long int, long long int; octal or ----> hexadecimal suffixed by the letter l or L: long int, ----> unsigned long int, long long int, unsigned long long int; ----> suffixed by both the letters u or U and l or L: unsigned ----> long int, unsigned long long int; decimal suffixed by ll or ----> LL: long long int; octal or hexadecimal suffixed by the ----> letter ll or LL: long long int, unsigned long long int; ----> suffixed by both u or U and ll or LL: unsigned long long ----> int. ----> ----> [#6] If an integer constant can not be represented by any ----> type in its list, it may have an extended integer type, if ----> the extended integer type can represent its value. If all ----> of the types in the list for the constant are signed, the ----> extended integer type shall be signed. If all of the types ----> in the list for the constant are unsigned, the extended ----> integer type shall be unsigned. If the list contains both ----> signed and unsigned types, the extended integer type may be ----> signed or unsigned. ----> ----> 6.1.3.3 Enumeration constants should be: [#5] The type of an integer constant is the first of the corresponding list in which its value can be represented. Unsuffixed decimal: int, long int, long long int; unsuffixed octal or hexadecimal: int, unsigned int, long int, unsigned long int, long long int, unsigned long long int; suffixed by the letter u or U: unsigned int, unsigned long int, unsigned long long int; decimal suffixed by the letter l or L: long int, long long int; octal or hexadecimal suffixed by the letter l or L: long int, unsigned long int, long long int, unsigned long long int; suffixed by both the letters u or U and l or L: unsigned long int, unsigned long long int; decimal suffixed by ll or LL: long long int; octal or hexadecimal suffixed by the letter ll or LL: long long int, unsigned long long int; suffixed by both u or U and ll or LL: unsigned long long int. If an integer constant can not be represented by any type in its list, it may have an extended integer type, if the extended integer type can represent its value. If all of the types in the list for the constant are signed, the extended integer type shall be signed. If all of the types in the list for the constant are unsigned, the extended integer type shall be unsigned. If the list contains both signed and unsigned types, the extended integer type may be signed or unsigned. 6.1.3.3 Enumeration constants ########################################################################### ########################################################################### N701 Page 159, 7.1.1 Definitions of terms, para 3, footnote 132 has not been updated: ----> 132. The functions that make use of the decimal-point ----> character are localeconv, fprintf, fscanf, printf, ----> scanf, sprintf, sscanf, vfprintf, vscanf, vprintf, ----> vsprintf, atof, and strtod. should read: 132. The functions that make use of the decimal-point character are atof, fprintf, fscanf, fwprintf, fwscanf, localeconv, printf, scanf, sprintf, sscanf, strtod, swprintf, swscanf, vfprintf, vfwprintf, vfwprintf, vfwscanf, vprintf,vscanf, vsprintf, vswprintf, vswscanf, vwprintf, vwscanf, wprintf, wscanf, ########################################################################### ########################################################################### N705 Page 90, 6.4 Constant expressions, para 9, correct the punctuation to represent DR145 as passed by the committee: ----> [#9] An address constant is a null pointer, a pointer to an ----> lvalue designating an object of static storage duration, or ----> to a function designator; it shall be created explicitly, ----> using the unary & operator, or an integral constant cast to ----> pointer type, or implicitly by the use of an expression of | ----> array or function type. The array-subscript [] and member- ----> access . and -> operators, the address & and indirection * ----> unary operators, and pointer casts may be used in the ----> creation of an address constant, but the value of an object ----> shall not be accessed by use of these operators. should be: [#9] An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or to a function designator. It shall be created explicitly using the unary & operator or an integral constant cast to pointer type, or implicitly by the use of an expression of | array or function type. The array-subscript [] and member- access . and -> operators, the address & and indirection * unary operators, and pointer casts may be used in the creation of an address constant, but the value of an object shall not be accessed by use of these operators. Here is what has changed: [#9] An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or to a function designator. It shall be created explicitly ^ ^ Capitalized ^ Comma | Semicolon changed to a period removed using the unary & operator or an integral constant cast to ^ Comma removed pointer type, or implicitly by the use of an expression of array or function type. The array-subscript [] and member- access . and -> operators, the address & and indirection * unary operators, and pointer casts may be used in the creation of an address constant, but the value of an object shall not be accessed by use of these operators. ______________________________ Page 344, 7.16.3 Time conversion functions, para 1, change ``functions return a pointer in one of'' to ``functions each return a pointer to one of'': ----> [#1] Except for the strftime function, these functions | ----> return a pointer in one of two types of static objects: a should be: [#1] Except for the strftime function, these functions each return a pointer to one of two types of static objects: a ########################################################################### ########################################################################### N707 Page 148, 6.8.3 Macro replacement, para 10, correct the font of ``# define'', there are two occurrences. And correct the font of the right paren on the same lines: ----> # define identifier lparen ... ) replacement-list new-line| ^^^^^^^^ ^ ----> # define identifier lparen identifier-list , ... ) replacement-list new-line| ^^^^^^^^ ^ ______________________________ Page 154, 6.8.3.5 Scope of macro definitions, para 7, in example 7 add spaces around ``?'', add spaces around ``:'': ----> ((x>y)?puts("x>y"):printf("x is %d but y is %d", x, y)); should be: ((x>y) ? puts("x>y") : printf("x is %d but y is %d", x, y)); ^-------------^ ^---spaces added around the ? and : ########################################################################### ########################################################################### N716 Page 62, 6.3.2 Postfix operators, para 1, correct the font of the parens in the syntax: ----> ( type-name ) { initialize-list , } | ^ ^ ^ ^ | | | | These are in the wrong font ########################################################################### ########################################################################### N717 Page 8, 5.1.1.2, Translation phases, para 1, phase 4, change the forward reference ``(16.3.3)'' to ``(6.8.3.3)''. N717 as passed has (16.3.3) however the editor is suppose to correct cross/forward references as the put in to reflect the current clause numbering. ----> is produced by token concatenation (16.3.3), the | should be: is produced by token concatenation (6.8.3.3), the ______________________________ Page 9, 5.1.1.2, Translation phases, Forward references, due to the above change should a forward reference to ``the ## operator (6.8.3.3)'' be added? There is a forward reference to ``preprocessing directives (6.8)''. ______________________________ Page 29, 6.1.2 Identifiers, para 2, change ``10646-1'' to ``10646''. ----> identifier shall designate a character whose encoding in ISO ----> 10646-1 falls into one of the ranges specified in Annex ----> H.21 The first character shall be a nondigit character. should be: identifier shall designate a character whose encoding in ISO 10646 falls into one of the ranges specified in Annex H.21 The first character shall be a nondigit character. ______________________________ Page 407, Annex B, add the grammar for ``hex-quad'' as noted with the corrections for Annex B. ______________________________ Page 476, Annex H, change title ``informative'' to ``normative''. ----> Annex H ----> (informative) ----> ----> Universal-character-names for identifiers should be: Annex H (normative) Universal-character-names for identifiers ########################################################################### ########################################################################### N724 Page 40, 6.1.2.8.2 Integral types, para 2, add initial capitalization to the last sentence: is zero, it shall not affect the resulting value. if the | sign bit is one, then the value shall be modified in one of should be: is zero, it shall not affect the resulting value. If the sign bit is one, then the value shall be modified in one of ########################################################################### ########################################################################### N728 Page 236, 7.9.1 Type-generic macros, para 5, correct ``scalbnl'' to be ``scalbln''. This is a duplicate of the fix under N693. ----> scalbnl trunc should be: scalbln trunc ########################################################################### ########################################################################### N729 Page 257, 7.13.5.3 The fopen function, para 3, correct the reference in footnote 197 from ``7.14.2'' to ``7.13.2'': ----> 197. If the string begins with one of the above sequences, ----> the implementation might choose to ignore the remaining ----> characters, or it might use them to select different ----> kinds of a file (some of which might not conform to the | ----> properties in 7.14.2). should be: 197. If the string begins with one of the above sequences, the implementation might choose to ignore the remaining characters, or it might use them to select different kinds of a file (some of which might not conform to the | properties in 7.13.2). ______________________________ Page 279, 7.13.6.12 The vfscanf function, para 2, add a reference to footnote 213 at the end of the paragraph. Note this is a backwards reference as footnote 213 applies a list of functions in 7.13.6. The footnote appears on page 277 for 7.13.6.9 the vprintf function, para 2, for the first time. ----> subsequent va_arg calls). The vfscanf does not invoke the ----> va_end macro. should be: subsequent va_arg calls). The vfscanf does not invoke the va_end macro.213 ______________________________ Page 279, 7.13.6.13 The vscanf function, para 2, add a reference to footnote 213 at the end of the paragraph. Note this is a backwards reference as footnote 213 applies a list of functions in 7.13.6. The footnote appears on page 277 for 7.13.6.9 the vprintf function, para 2, for the first time. THIS IS NOT A DUPLICATE OF THE ABOVE CHANGE ----> subsequent va_arg calls). The vscanf does not invoke the ----> va_end macro. should be: subsequent va_arg calls). The vscanf does not invoke the va_end macro.213 ______________________________ Page 371, 7.19.2.7 The vfwprintf function, para 2, footnote 263, remove the duplicate function ``vswscanf'': ----> 263. As the functions vfwprintf, vswprintf, vswscanf, | ----> vfwscanf, vwprintf, vwscanf, and vswscanf invoke the | ----> va_arg macro, the value of arg after the return is | ----> indeterminate. should be: 263. As the functions vfwprintf, vswprintf, vfwscanf, vwprintf, vwscanf, and vswscanf invoke the va_arg macro, the value of arg after the return is indeterminate. ______________________________ Page 373, 7.19.2.10, The vfwscanf function, para 2, add a reference to footnote 263 at the end of the paragraph. Note this is a backwards reference as footnote 263 applies a list of functions in 7.19.2. The footnote appears on page 371 for 7.19.2.7 The vfwprintf function, para 2, for the first time. ----> subsequent va_arg calls). The vfwscanf function does not ----> invoke the va_end macro. should be: subsequent va_arg calls). The vfwscanf function does not invoke the va_end macro.263 ########################################################################### ########################################################################### N736 Page 144, 6.8.1, Conditional inclusion, para 4, change ``comprise'' to ``compose'': ----> token is converted into a token. The resulting tokens ----> comprise the controlling constant expression which is | ----> evaluated according to the rules of 6.4, except that all should be: token is converted into a token. The resulting tokens compose the controlling constant expression which is evaluated according to the rules of 6.4, except that all ########################################################################### ########################################################################### N739 Page 29, 6.1.2 Identifiers, para 3, correct ``denotes'' to ``denote'' and ``demote'' to ``denote''. ----> [#3] An identifier can denotes an object, a function, or one | ----> of the following entities that will be described later: a ----> tag or a member of a structure, union, or enumeration; a ----> typedef name; a label name; a macro name; or a macro ----> parameter. The same identifier can demote different | should be: [#3] An identifier can denote an object, a function, or one of the following entities that will be described later: a tag or a member of a structure, union, or enumeration; a typedef name; a label name; a macro name; or a macro parameter. The same identifier can denote different ______________________________ Page 35, 6.1.2.4 Storage durations of objects, para 12, this paragraph is suppose to be the last sentence of paragraph 14: ----> [#12] The implementation shall define char to have the same | ----> range, representation, and behavior as one of signed char | ----> and unsigned char.30 | ----> [#13] The type char, the signed and unsigned integer types, ----> and the floating types are collectively called the basic ----> types. Even if the implementation defines two or more basic ----> types to have the same representation, they are nevertheless ----> different types.31 ----> [#14] The three types char, signed char, and unsigned char ----> are collectively called the character types. should be: [#12] The type char, the signed and unsigned integer types, and the floating types are collectively called the basic types. Even if the implementation defines two or more basic types to have the same representation, they are nevertheless different types.31 [#13] The three types char, signed char, and unsigned char are collectively called the character types. The implementation shall define char to have the same range, representation, and behavior as one of signed char and unsigned char.30 Obviously the paragraphs and footnotes need renumbering. ______________________________ Page 59, 6.2.2.3 Pointers, para 4, add the following four paragraphs and three footnotes after paragraph 4 of subclause 6.2.2.3 as shown below, this should create new paragraphs numbered 5, 6, 7, and 8: ----> [#4] Conversion of null pointer to another pointer type ----> yields a null pointer of that type. Any two null pointers ----> shall compare equal. ----> ----> Forward references: cast operators (6.3.4), equality | ----> operators (6.3.9), simple assignment (6.3.16.1). should be: [#4] Conversion of null pointer to another pointer type yields a null pointer of that type. Any two null pointers shall compare equal. [#5] An integer may be converted to any pointer type. The result is implementation-defined, and might not be a pointer to an object of that type. [*] [*] The mapping functions for converting a pointer to an integer or an integer to a pointer are intended to be consistent with the addressing structure of the execution environment. [#6] Any pointer type may be converted to an integral type; the result is implementation-defined, and need not be in the range of values of any integral type. If the resulting value cannot be represented in the destination type, the behavior is undefined. [*] [*] Thus if the conversion is to /unsigned int/ but yields a negative value, the behavior is undefined. [#7] A pointer to a complete or incomplete object type may be converted to a pointer to a different complete or incomplete object type. If the resulting pointer is not correctly aligned for the pointed to type, the behavior is undefined. Otherwise, when converted back again, the result shall compare equal to the original pointer. [*] [*] All pointers to character types are correctly aligned. In general, the concept "correctly aligned" is transitive: if a pointer to type A is correctly aligned for a pointer to type B, which in turn is correctly aligned for a pointer to type C, then a pointer to type A is correctly aligned for a pointer to type C. [#8] A pointer to a function of one type may be converted to a pointer to a function of another type and back again; the result shall compare equal to the original pointer. If a converted pointer is used to call a function that has a type that is not compatible with the type of the called function, the behavior is undefined. Forward references: cast operators (6.3.4), equality operators (6.3.9), simple assignment (6.3.16.1). ______________________________ Page 75, 6.3.4 Cast operators, para 4, delete paragraph 4, this includes the four indented subparagraphs and delete footnote 78: ----> [#3] Preceding an expression by a parenthesized type name ----> converts the value of the expression to the named type. ----> This construction is called a cast.76 A cast that specifies ----> no conversion has no effect on the type or value of an ----> expression.77 ----> ----> [#4] Conversions that involve pointers (other than as | ----> permitted by the constraints of 6.3.16.1) shall be specified ----> by means of an explicit cast; they have implementation- ----> defined and undefined aspects: ----> ----> A pointer may be converted to an integral type. The ----> size of integer required and the result are ----> implementation-defined. If the space provided is not ----> long enough, the behavior is undefined. ----> ----> An arbitrary integer may be converted to a pointer. ----> The result is implementation-defined.78 ----> ----> A pointer to an object or incomplete type may be ----> converted to a pointer to a different object type or a ----> different incomplete type. The resulting pointer might ----> not be valid if it is improperly aligned for the type ----> pointed to. It is guaranteed, however, that a pointer ----> to an object of a given alignment may be converted to a ----> pointer to an object of the same alignment or a less ----> strict alignment and back again; the result shall ----> compare equal to the original pointer. (An object that ----> has character type has the least strict alignment.) ----> ----> ----> ----> __________ ----> ----> 76. A cast does not yield an lvalue. Thus, a cast to a ----> qualified type has the same effect as a cast to the ----> unqualified version of the type. ----> ----> 77. If the value of the expression is represented with ----> greater precision or range than required by the type ----> named by the cast (6.2.1.7), then the cast specifies a | ----> conversion even if the type of the expression is the ----> same as the named type. ----> ----> 78. The mapping functions for converting a pointer to an ----> integer or an integer to a pointer are intended to be ----> consistent with the addressing structure of the ----> execution environment. ----> ----> ----> ----> 96 Language ----> ----> ----> ----> ----> ----> ----> ----> ----> ----> C9X Draft 11-pre3, 1997-09-07, WG14/Nxxx J11/97-xxx ----> ----> ----> A pointer to a function of one type may be converted to ----> a pointer to a function of another type and back again; ----> the result shall compare equal to the original pointer. ----> If a converted pointer is used to call a function that ----> has a type that is not compatible with the type of the ----> called function, the behavior is undefined. ----> ----> Forward references: equality operators (6.3.9), function | ----> declarators (including prototypes) (6.5.5.3), simple | ----> assignment (6.3.16.1), type names (6.5.6). ----> ----> 6.3.5 Multiplicative operators should be: [#3] Preceding an expression by a parenthesized type name converts the value of the expression to the named type. This construction is called a cast.76 A cast that specifies no conversion has no effect on the type or value of an expression.77 Forward references: equality operators (6.3.9), function | declarators (including prototypes) (6.5.5.3), simple | assignment (6.3.16.1), type names (6.5.6). __________ 76. A cast does not yield an lvalue. Thus, a cast to a qualified type has the same effect as a cast to the unqualified version of the type. 77. If the value of the expression is represented with greater precision or range than required by the type named by the cast (6.2.1.7), then the cast specifies a | conversion even if the type of the expression is the same as the named type. Language C9X Draft 11-pre3, 1997-09-07, WG14/Nxxx J11/97-xxx 6.3.5 Multiplicative operators ______________________________ Page 75, 6.3.4 Cast operators, add a new constraint paragraph after paragraph 2 as shown: ----> [#2] Unless the type name specifies a void type, the type ----> name shall specify qualified or unqualified scalar type and ----> the operand shall have scalar type. ----> Semantics should be: [#2] Unless the type name specifies a void type, the type name shall specify qualified or unqualified scalar type and the operand shall have scalar type. Conversions that involve pointers, other than where permitted by the constraints of 6.3.16.1, shall be specified by means of an explicit cast. Semantics ______________________________ Page 94, 6.5.2 Type specifiers, para 3, change "scope of function" to "scope or function" ______________________________ Page 94, 6.5.2 Type specifiers, para 5, change ``the type'' to ``the same type'': defined whether the specified int is the same type as signed int or is the type as unsigned int. | should be: defined whether the specified int is the same type as signed int or is the same type as unsigned int. ______________________________ Page 95, 6.5.2.1 Structure and union specifiers [#7] A member of a structure or union may have any object type other than a variable modified type. ^^^^^^^^ variably ########################################################################### ########################################################################### N740 Page 130, 6.6.5 Iteration statements, para 2, make the second sentence of the constraint a paragraph: ----> [#2] The controlling expression of an iteration statement ----> shall have scalar type. The declaration in a for loop shall ----> only have storage class auto or register. should be: [#2] The controlling expression of an iteration statement shall have scalar type. [#3] The declaration in a for loop shall only have storage class auto or register. ______________________________ Page 418, Annex B, fix the grammar for ``compound-statement'' as noted with the corrections for Annex B. ______________________________ Page 419, Annex B, fix the grammar for ``iteration-statement'' as noted with the corrections for Annex B, missing second ``for''. ########################################################################### ########################################################################### DR142 changes from the 6/97 London minutes: Page 161, 7.1.3 Reserved identifiers, para 1, third bullet, delete the word ``listed'': ----> - Each macro name listed in any of the following should be: - Each macro name in any of the following COMMENT: Since there are so many errors in applying changes to the draft it is impossible to tell when acceptable editorial discretion has been used, or an error has occurred. Personally, I think the paragraph reads better with the word ``listed''. However, since there is absolutely no way to tell if this was editorial discretion or another error, I suggest that we make the exact change that was approved. The paragraph is correct either way. ########################################################################### ###########################################################################