JTC1/SC22/WG14
N779
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 <tgmath.h> 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 <setjmp.h>
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 <math.h>
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 <float.h> and <limits.h>:
----> Forward references: limits <float.h> and <limits.h> |
----> (7.1.6).
should be:
Forward references: limits <float.h> and <limits.h> |
(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 <stddef.h> (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 <stddef.h> (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 <stddef.h> (7.1.6). |
should be:
Forward references: array declarators (6.5.5.2), common
definitions <stddef.h> (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 <float.h> and <limits.h>:
----> Forward references: common definitions <stddef.h> (7.1.5). |
should be:
Forward references: common definitions <stddef.h> (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 <locale.h>, 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 <assert.h>, add and
renumber all subsequent subclauses of D:
D.<n> Boolean type and values <stdbool.h>
bool
true
false
__bool_true_false_are_defined
______________________________
Page 423, Annex D, para 1, before D.5 Localization <locale.h>, add and
renumber all subsequent subclauses of D:
D.<n> Integral types <inttypes.h>
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.<n> Floating-point environment <fenv.h>
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 <math.h>, 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 <complex.h>, add the following
missing entry:
_Complex_I
______________________________
Page 426, Annex D, para 1, before D.8 Nonlocal jumps <setjmp.h>, add and
renumber all subsequent subclauses of D:
D.<n> Type-generic math <tgmath.h>
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 <stdarg.h>, add the
following missing entry:
void va_copy(va_list dest, va_list src);
______________________________
Page 427, Annex D, para 1, D.11 Input/output <stdio.h>, 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 <stdio.h>, add the
following missing entry:
long int ftell(FILE *stream);
______________________________
Page 430, Annex D, para 1, D.12 General utilities <stdlib.h>, add the
following missing entry:
lldiv_t
______________________________
Page 430, Annex D, para 1, D.12 General utilities <stdlib.h>, 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 <stdlib.h>, 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 <time.h>, 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 <stdbool.h>, 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 <file.h>
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 <stddef.h>
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 <stddef.h>
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 |
----> <math.h>. 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
<math.h>. 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 <tgmath.h> [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 <complex.h>
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 <math.h>.
###########################################################################
###########################################################################
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 <math.h> |
----> double fma(double x, double y, double z); |
----> int isunordered(real-floating x, real-floating y); |
---->
----> Description |
should be:
[#1] |
#include <math.h> |
double fma(double x, double y, double z); |
Description |
______________________________
Page 226, 7.8 Complex arithmetic <complex.h>, 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 <math.h>
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 <complex.h>
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.
<page number> 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.
###########################################################################
###########################################################################