.B code
.I identifier
.B
-.I identifier
+.I item-name
.RI [ constraints ]
.B {
.I c-fragment
.br
.I constraint
::=
+.IR item-name \*+
+.br
+.I item-name
+::=
+.I identifier
+|
+.B (
.IR identifier \*+
+.B )
.
.SS Class definitions
.I
.IR list [ identifier ]
.<
.B {
-.IR class-item \**
+.IR properties-class-item \**
.B }
.br
+.I properties-class-item
+::=
+.RI [ properties ]
+.I class-item
+.br
.I class-item
::=
.I slot-item
.I slot-item
::=
.<
-.RI [ properties ]
.IR declaration-specifier \*+
.IR list [ init-declarator ]
.B ;
.br
.I initializer-item
::=
-.RI [ properties ]
.RB [ class ]
.IR list [ slot-initializer ]
.B ;
.br
.I message-item
::=
-.RI [ properties ]
.<
.IR declaration-specifier \*+
.I simple-declarator
-.<
.RI [ method-body ]
.br
.I method-item
-.RI [ properties ]
+::=
.<
.IR declaration-specifier \*+
-.I dotted-declarator
-.<
+.IR declarator [ dotted-name ]
.I method-body
.br
.I method-body
|
.B unsigned
.|
+.B bool
+|
+.B _Bool
+.|
+.B imaginary
+|
+.B _Imaginary
+|
+.B complex
+|
+.B _Complex
+.|
.I qualifier
+.|
+.I storage-specifier
+.|
+.I atomic-type
.br
.I qualifier
::=
+.I atomic
+|
.B const
|
.B volatile
|
.B restrict
.br
+.I atomic-type
+::=
+.I
+atomic
+.B (
+.IR declaration-specifier \*+
+.I abstract-declarator
+.B )
+.br
+.I atomic
+::=
+.B atomic
+|
+.B _Atomic
+.br
+.I storage-specifier
+::=
+.I alignas
+.B (
+.I c-fragment
+.B )
+.br
+.I alignas
+::=
+.B alignas
+|
+.B _Alignas
+.br
.I type-name
::=
.I identifier
.PP
+The following
+.IR type-name s
+are defined in the built-in module.
+.hP \*o
+.B va_list
+.hP \*o
+.B size_t
+.hP \*o
+.B ptrdiff_t
+.hP \*o
+.B wchar_t
+.PP
Declaration specifiers may appear in any order.
However, not all combinations are permitted.
A declaration specifier must consist of
-zero or more qualifiers,
+zero or more
+.IR qualifier s,
+zero or more
+.IR storage-specifier s,
and one of the following, up to reordering.
.hP \*o
.I type-name
.BR float ,
.BR double ,
.B long double
+.hP \*o
+.BR "float _Imaginary" ,
+.BR "double _Imaginary" ,
+.B "long double _Imaginary"
+.hP \*o
+.BR "float imaginary" ,
+.BR "double imaginary" ,
+.B "long double imaginary"
+.hP \*o
+.BR "float _Complex" ,
+.BR "double _Complex" ,
+.B "long double _Complex"
+.hP \*o
+.BR "float complex" ,
+.BR "double complex" ,
+.B "long double complex"
.PP
.IR declarator [ k ]
::=
.IR declaration-specifier \*+
.I argument-declarator
.br
+.I abstract-declarator
+::=
+.IR declarator [\*e]
+.br
.I argument-declarator
::=
.IR declarator [ identifier " | \*e]"
.I identifier
.B .\&
.I identifier
-.br
-.I dotted-declarator
-::=
-.IR declarator [ dotted-name ]
-
+.
.\"--------------------------------------------------------------------------
.SH SEE ALSO
.BR sod (1),