mirror of
https://git.freebsd.org/src.git
synced 2026-01-11 19:57:22 +00:00
stddef.h: add unreachable() for C23 compliance
unreachable() is a hint to the compiler that it is unreachable. Add a new man page unreachable(3) to document this macro. Reviewed by: imp Approved by: markj (mentor) MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D53967
This commit is contained in:
parent
04d000a378
commit
b381d09802
4 changed files with 98 additions and 3 deletions
|
|
@ -61,6 +61,10 @@ typedef __max_align_t max_align_t;
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if __ISO_C_VISIBLE >= 2023
|
||||
#define unreachable(x) __unreachable(x)
|
||||
#endif
|
||||
|
||||
#ifndef offsetof
|
||||
#define offsetof(type, field) __builtin_offsetof(type, field)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -35,7 +35,8 @@ MAN= alloca.3 \
|
|||
sysexits.3 \
|
||||
tgmath.3 \
|
||||
timeradd.3 \
|
||||
tree.3
|
||||
tree.3 \
|
||||
unreachable.3
|
||||
|
||||
MLINKS= arb.3 ARB8_ENTRY.3 \
|
||||
arb.3 ARB8_HEAD.3 \
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd April 20, 2021
|
||||
.Dd November 27, 2025
|
||||
.Dt ASSERT 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
|
@ -118,7 +118,8 @@ constraint and includes the provided string literal:
|
|||
If none is provided, it only points at the constraint.
|
||||
.Sh SEE ALSO
|
||||
.Xr abort2 2 ,
|
||||
.Xr abort 3
|
||||
.Xr abort 3 ,
|
||||
.Xr unreachable 3
|
||||
.Sh STANDARDS
|
||||
The
|
||||
.Fn assert
|
||||
|
|
|
|||
89
share/man/man3/unreachable.3
Normal file
89
share/man/man3/unreachable.3
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
.\"
|
||||
.\" Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
|
||||
.\"
|
||||
.\" SPDX-License-Identifier: BSD-2-Clause
|
||||
.\"
|
||||
.Dd November 27, 2025
|
||||
.Dt UNREACHABLE 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm unreachable
|
||||
.Nd the unreachable macro
|
||||
.Sh SYNOPSIS
|
||||
.In stddef.h
|
||||
.Fd #define unreachable()
|
||||
.Sh DESCRIPTION
|
||||
If the
|
||||
.Fn unreachable
|
||||
macro is reached during execution, behavior is undefined.
|
||||
This can be useful to hint to the compiler that some invariant is guaranteed to
|
||||
hold or that some case cannot occur.
|
||||
.Sh EXAMPLES
|
||||
Suppose a floating-point number
|
||||
.Va x
|
||||
is to be classified using the
|
||||
.Xr fpclassify 3
|
||||
macro and a different action is to be taken based on the result of the
|
||||
classification.
|
||||
As the set of possible return values is known, the
|
||||
.Fn unreachable
|
||||
macro can be used to hint to the compiler that it can omit checks for
|
||||
other possible return values:
|
||||
.Bd -literal -offset 3n
|
||||
#include <math.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void print_classification(double x)
|
||||
{
|
||||
printf("%f: ", x);
|
||||
|
||||
switch (fpclassify(x)) {
|
||||
case FP_INFINITE:
|
||||
puts("infinite");
|
||||
break;
|
||||
|
||||
case FP_NAN:
|
||||
puts("not a number");
|
||||
break;
|
||||
|
||||
case FP_NORMAL:
|
||||
puts("normal");
|
||||
break;
|
||||
|
||||
case FP_SUBNORMAL:
|
||||
puts("subnormal");
|
||||
break;
|
||||
|
||||
case FP_ZERO:
|
||||
puts("zero");
|
||||
break;
|
||||
|
||||
default:
|
||||
unreachable();
|
||||
}
|
||||
.Ed
|
||||
.Sh SEE ALSO
|
||||
.Xr assert 3
|
||||
.Sh STANDARDS
|
||||
The
|
||||
.Fn unreachable
|
||||
macro conforms to
|
||||
.St -isoC-2023 .
|
||||
.Sh HISTORY
|
||||
A
|
||||
.Dv /*NOTREACHED*/
|
||||
conventional comment was supported by the historical
|
||||
.Xr lint 1
|
||||
utility to suppress warnings about unreachable statements during static
|
||||
analysis.
|
||||
The
|
||||
.Fn unreachable
|
||||
macro was added in
|
||||
.Fx 15.1
|
||||
based on the earlier private
|
||||
.Fn __unreachable
|
||||
macro for compliance with
|
||||
.St -isoC-2023 .
|
||||
.Sh AUTHOR
|
||||
.Ah Robert Clausecker Aq Mt fuz@FreeBSD.org
|
||||
Loading…
Add table
Reference in a new issue