.\" @N
.\" @STR
.\" @GLUE
+.\" @GLUE3
.\" @STATIC_ASSERT
.\" @CHECK_TYPE
.\" @CONVERT_CAREFULLY
.\" @DISCARD
.\" @IGNORE
.\" @LAUNDER
+.\" @ADMIRE
+.\" @ADMIRE_BUF
.\" @RELAX
.
.\" @DEPRECATED
.BI "size_t N(" type " " array "[]);"
.BI "STR(" tokens\fR... ")"
.BI "GLUE(" tokens\fR... ", " tokens\fR... ")"
+.BI "GLUE3(" tokens\fR... ", " tokens\fR... ", " tokens\fR... ")"
.BI "STATIC_ASSERT(" cond ", " msg ");"
.BI "int CHECK_TYPE(" expty ", " expty " " x );
.IB newty " CONVERT_CAREFULLY(" newty ", " expty ", " expty " " x );
.PP
.BI "void DISCARD(" scalar ");"
.BI "void IGNORE(" variable ");"
+.IB type " LAUNDER(" type " " x ");"
+.BI "void ADMIRE(" type " " x ");"
+.BI "void ADMIRE_BUF(void *" p ", size_t " sz ");"
+.B "void RELAX;"
.PP
.BI "DEPRECATED(" msg ")"
.BI "EXECL_LIKE(" ntrail ")"
the tokens resulting from expanding its argument token lists. Each of
the argument token lists must expand to a single preprocessing token,
and the result of gluing these tokens together must be valid
-preprocessing token.
+preprocessing token. The
+.B GLUE3
+macro does the same, except that it glues together
+.I three
+argument token lists rather than two.
.PP
The
.B STATIC_ASSERT
The
.B LAUNDER
macro tries to confuse a compiler so that it `forgets' what it knows
-about a particular value. This is most useful in benchmarking or
-similar applications.
+about a particular value.
+.PP
+The
+.B ADMIRE
+macro tries to confuse a compiler so that it will faithfully computes
+the argument
+.I x
+even though it's not used for anything. The
+.B ADMIRE_BUF
+macro works similarly, but on regions of memory.
.PP
The
.B RELAX
macro tries do nothing, but in a way that a compiler won't optimize
away.
-.
+.PP
+The
+.BR LAUNDER ,
+.BR ADMIRE ,
+.BR ADMIRE_BUF ,
+and
+.B RELAX
+macros are most useful in benchmarking and similar applications.
.SS Annotations
The following annotations can be attached to function declarations and
definitions, as part of the declaration specifiers. (Other positions