ISO/ IEC 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.

###########################################################################
###########################################################################