This page tracks the progress of adding C23 support to FreeBSD. The final draft of the standard can be found in N3220.

Contact person: RobertClausecker (fuz)

Work items

This list may be incomplete.

libc

Item

Status

Patches

Owner

Description

printf("%b"), scanf("%b")

landed

D41511

des

binary format for integers

printf("%wNd"), scanf("%wNd")

landed

D41725

des

fixed-width integer/float support

memset_explicit()

landed

D47286

fuz

like explicit_bzero() but for memset

memccpy(), strdup(), strndup()

landed

D47856

shurd

POSIX functions added to C23, visibility changes in <string.h> only

gmtime_r(), localtime_r()

landed

D47856

shurd

POSIX functions added to C23, visibility changes in <time.h> only

timegm()

landed

D53951

fuz

BSD function added to C23, visibility change in <time.h> only

memalignment()

landed

D53673

fuz

finds the alignment of an object

*_WIDTH

landed

D53825, D53830, D53831

fuz

preprocessor macros to get the width of integer types

stdbit.h

landed

D53657, D53660, D53658, D53659, D53661

fuz

bit manipulation functions

QChar/QVoid prototypes in string.h

open

string functions carry over their argument's const-ness to the return value

nullptr, nullptr_t

hold

type for null pointers in <stddef.h> (needs LLVM 20 it seems)

unreachable()

hold

D53967

fuz

unreachable statement hint (needs rework)

char8_t, atomic_char8_t

landed

D53952 D54124

fuz

alias for unsigned char in <uchar.h>, <stdatomic.h>

mbrtoc8(), c8rtomb()

open

restartable UTF-8 conversion functions

free_sized(), free_aligned_sized()

open

variants of free() with explicit size/alignment parameters

libm

This is in scope of the Numerics project.

Item

Status

Patches

Owner

Description

tgmath.h additions

open

type-generic variants of all the new libm functions

sinpif(), sinpi(), sinpil()

landed

D53783, bug218514

kargl

sinpi(x) = sin(πx)

cospif(), cospi(), cospil()

landed

D53783, bug218514

kargl

cospi(x) = cos(πx)

tanpif(), tanpi(), tanpil()

landed

D53783, bug218514

kargl

tanpi(x) = tan(πx)

acospi(), acospif(), acospil()

open

acospi(x) = acos(x)/π

asinpi(), asinpif(), asinpil()

open

asinpi(x) = asin(x)/π

atanpi(), atanpif(), atanpil()

open

atanpi(x) = atan(x)/π

atanpi(), atanpif(), atanpil()

open

atan2pi(x,y) = atan2(x,y)/π

canonicalize(), canonicalizef(), canonicalizel()

open

compute canonical representation of FP value

compoundn(), compoundnf(), compoundnl()

open

compound(x) = (1 + x)n

fadd(), faddl(), daddl()

open

add and round to narrower type

fdiv(), fdivl(), ddivl()

open

divide and round to narrower type

ffma(), ffmal(), dfmal()

open

fused multiply-add and round to narrower type

fmul(), fmull(), dmull()

open

multiply and round to narrower type

fsqrt(), fsqrtl(), dsqrtl()

open

square-root and round to narrower type

fsub(), fsubl(), dsubl()

open

subtract and round to narrower type

exp10(), exp10f(), exp10l()

open

exp10(x) = 10x

exp10m1(), exp10m1f(), exp10m1l()

open

exp10m1(x) = 10x − 1

exp2m1(), exp2m1f(), exp2m1l()

open

exp2m1(x) = 2x − 1

fmaximum(), fmaximumf(), fmaximuml()

open

maximum where -0.0 < +0.0

fminimum(), fminimumf(), fminimuml()

open

minimum where -0.0 < +0.0

fmaximum_mag(), fmaximum_magf(), fmaximum_magl()

open

return number with higher magnitude, else return fmaximum()

fminimum_mag(), fminimum_magf(), fminimum_magl()

open

return number with lower magnitude, else return fminimum()

fmaximum_num(), fmaximum_numf(), fmaximum_numl()

open

like fmaximum(), but picks the number when one argument is NaN

fminimum_num(), fminimum_numf(), fminimum_numl()

open

like fminimum(), but picks the number when one argument is NaN

fmaximum_mag_num(), fmaximum_mag_numf(), fmaximum_mag_numl()

open

like fmaximum_mag(), but picks the number when one argument is NaN

fminimum_mag_num(), fminimum_mag_numf(), fminimum_mag_numl()

open

like fminimum_mag(), but picks the number when one argument is NaN

fromfp(), fromfpf(), fromfpl()

open

round to signed integer of given width with given rounding mode

ufromfp(), ufromfpf(), ufromfpl()

open

round to unsigned integer of given width with given rounding mode

fromfpx(), fromfpxf(), fromfpx()

open

round to signed integer of given width with given rounding mode with inexact exception

ufromfpx(), ufromfpxf(), ufromfpxl()

open

round to unsigned integer of given width with given rounding mode with inexact exception

iscanonical()

open

check if FP number is canonical

iseqsig()

open

check for equal sign

issignaling()

open

check for signalling NaN

issubnormal()

open

check for subnormal number

iszero()

open

check for zero

nextdown(), nextdownf(), nextdownl()

open

return next lowest FP number

nextup(), nextupf(), nextdownf()

open

return next highest FP number

pown(), pownf(), pownl()

open

pown(x, n) = xn (integral powers)

powr(), powrf(), powrl()

open

powr(y, x) = ey ln x (pow with limited range)

rootn(), rootnf(), rootnl()

open

rootn(x, n) = x1/n (principal roots)

rsqrt(), rsqrtf(), rsqrtl()

open

rsqrt(x) = 1/sqrt(x)

roundeven(), roundevenf(), roundevenl()

open

nearest integer with round-to-even semantics

This list does not include decimal floating point functions.

C23 (last edited 2025-12-08T12:40:54+0000 by RobertClausecker)