From nobody Tue Jun 9 11:27:55 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gZRV91pYqz6hp2x for ; Tue, 09 Jun 2026 11:28:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gZRV86ypHz3cRS for ; Tue, 09 Jun 2026 11:28:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781004481; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=LSnYUdoiwZmbyAv/ii0JVG18HFqVxvr56igCMUwQpT4=; b=Cj+cRlsVAlvbcN5ep2hQGEA2Fw8QS5PQsI5BM44xEOuI9H5cK35K9Q3opOvaRNQP4X4niC kxJiQkvolJ7h9LTnHBkTzUs2sM3Qja2XsjSCM1LG7pLSlAKDrZD16b8ufT5xS8RLm/BnIq Delqafn+YfOxR5sS+2u8UYRKw6gCqbjH6tPlLuWKSJJRaZIutZlP5vfgXnrVvNxPY1FUbu 0qgMNFbaD3st3JnAljhyLy4vQ0Ch/0ZKAtAb7bLOiC+vkNYgbCdebfwC55gtnEoKgQR+VM TdGeaGJqQDFlGh9U6Le0729CcoJ+fcN1AuCfC+LgelEPYQxADNw3lkm27IOIpQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1781004481; a=rsa-sha256; cv=none; b=ewQWQ3KLt14544Nit46lLq66jQCRkKdL7KTEk0huXUxzRCXXctzcSAVSOlusYeTOpl/OhX m3IlvJFrYt1sdYdNE6hdgha3NyeaQPnzpgkzR9czS9dPUARlucSxIdXB3q0JufcGanYQgt K+5TbQ66UuI3epTDVGdQNpr5u+hWXgH6eX5SAXr9yzXVFC80/HuW41GZ1mbLf3AH2eFpjS OlnCYAU1KX2HAYUiuAKjSvHcVekvQLE5USwX0lViQCPgtJgs0xZR/+I9ujV5TaYvUT9NDF HqKiMOk/kAfBQ32oKvfdIchf7Lq+Zkewloktm79CQRGH2ts0Y4sm0Rq/RTUybw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781004481; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=LSnYUdoiwZmbyAv/ii0JVG18HFqVxvr56igCMUwQpT4=; b=yetdt+Y/Nuu35QfoIe6y8QOZJGmqCDmYALJ52YjqkcmuYUt733vTKbghDRd/f0dEBLHCz/ 0bWLlNhfumCNljC7RfjrwnSRBAVYpbKyjsFOKuaG7xEkHrkgcgLuoALVwvrTF5RXNf2aDS bIZaU4FJTYS+GAHfz+Qlw+NLKyCgOEiCX0AflN8DRN1azoywiltWxb8R99Nc/D2519cgOj V4Kzt0X6CDeLG2xbq7eJ/d1jLMqck9HOYPfQ700nBPbzokYeynZP9Oa1wJqtrWCvJ2V01E 9WQ7M6Xqa+1jlJAG102Cp7Fe7rq0/3bS+uf2vzgamQ8xOzmqAP2sBw+MWByhyA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gZRV86ZC7zYVh for ; Tue, 09 Jun 2026 11:28:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3257d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 09 Jun 2026 11:27:55 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: ShengYi Hung Subject: git: 9c0489508695 - main - libc: Use slow path in fenv in C++ List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: aokblast X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9c0489508695fde3bdd742edfd1b4b681aab4d19 Auto-Submitted: auto-generated Date: Tue, 09 Jun 2026 11:27:55 +0000 Message-Id: <6a27f8bb.3257d.36b63bf9@gitrepo.freebsd.org> The branch main has been updated by aokblast: URL: https://cgit.FreeBSD.org/src/commit/?id=9c0489508695fde3bdd742edfd1b4b681aab4d19 commit 9c0489508695fde3bdd742edfd1b4b681aab4d19 Author: ShengYi Hung AuthorDate: 2026-06-04 08:58:28 +0000 Commit: ShengYi Hung CommitDate: 2026-06-09 11:25:30 +0000 libc: Use slow path in fenv in C++ C++ exposes cfenv functions via using ::func. Our name-mangling mechanism rewrites all function calls causing symbols such as std::feclearexcept to be transformed into std::__feclearexcept_int. Since no such function exists, compilation fails. The using ::feclearexpect declarations themselves are unaffected because they are not function calls, which further exposes the mismatch As a result, enable the fast path only for C and fall back to the slow path in C++. Reviewed by: kib Fixes: 5bc64b7d417d MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D57450 --- lib/msun/aarch64/fenv.h | 10 ++++++++++ lib/msun/arm/fenv.h | 10 ++++++++++ lib/msun/powerpc/fenv.h | 12 ++++++++++++ lib/msun/riscv/fenv.h | 12 ++++++++++++ lib/msun/x86/fenv.h | 10 ++++++++++ 5 files changed, 54 insertions(+) diff --git a/lib/msun/aarch64/fenv.h b/lib/msun/aarch64/fenv.h index 5d47940cf9eb..aebcd99909ce 100644 --- a/lib/msun/aarch64/fenv.h +++ b/lib/msun/aarch64/fenv.h @@ -96,6 +96,15 @@ int feenableexcept(int); int fedisableexcept(int); int fegetexcept(void); +/* + * C permits a standard library function to also be exposed as a function-like + * macro (C23 7.1.4), and msun uses that here to inline the fast path. C++ + * forbids it: imports these names into namespace std (using + * ::feclearexcept; etc.), so std::feclearexcept() and friends must denote the + * actual functions. Expose the inlining macros to C only; C++ uses the real + * extern functions (defined in the matching lib/msun//fenv.c). + */ +#ifndef __cplusplus #define feclearexcept(a) __feclearexcept_int(a) #define fegetexceptflag(e, a) __fegetexceptflag_int(e, a) #define fesetexceptflag(e, a) __fesetexceptflag_int(e, a) @@ -110,6 +119,7 @@ int fegetexcept(void); #define feenableexcept(a) __feenableexcept_int(a) #define fedisableexcept(a) __fedisableexcept_int(a) #define fegetexcept() __fegetexcept_int() +#endif /* !__cplusplus */ __fenv_static inline int __feclearexcept_int(int __excepts) diff --git a/lib/msun/arm/fenv.h b/lib/msun/arm/fenv.h index 78ca9ef0f589..6febbf95008d 100644 --- a/lib/msun/arm/fenv.h +++ b/lib/msun/arm/fenv.h @@ -129,6 +129,15 @@ int fedisableexcept(int); int fegetexcept(void); #endif +/* + * C permits a standard library function to also be exposed as a function-like + * macro (C23 7.1.4), and msun uses that here to inline the fast path. C++ + * forbids it: imports these names into namespace std (using + * ::feclearexcept; etc.), so std::feclearexcept() and friends must denote the + * actual functions. Expose the inlining macros to C only; C++ uses the real + * extern functions (defined in the matching lib/msun//fenv.c). + */ +#ifndef __cplusplus #define feclearexcept(a) __feclearexcept_int(a) #define fegetexceptflag(e, a) __fegetexceptflag_int(e, a) #define fesetexceptflag(e, a) __fesetexceptflag_int(e, a) @@ -145,6 +154,7 @@ int fegetexcept(void); #define fedisableexcept(a) __fedisableexcept_int(a) #define fegetexcept() __fegetexcept_int() #endif +#endif /* !__cplusplus */ __fenv_static inline int __feclearexcept_int(int __excepts) diff --git a/lib/msun/powerpc/fenv.h b/lib/msun/powerpc/fenv.h index f6fb354470c7..8752be09994c 100644 --- a/lib/msun/powerpc/fenv.h +++ b/lib/msun/powerpc/fenv.h @@ -123,6 +123,15 @@ int feholdexcept(fenv_t *); int fesetenv(const fenv_t *); int feupdateenv(const fenv_t *); +/* + * C permits a standard library function to also be exposed as a function-like + * macro (C23 7.1.4), and msun uses that here to inline the fast path. C++ + * forbids it: imports these names into namespace std (using + * ::feclearexcept; etc.), so std::feclearexcept() and friends must denote the + * actual functions. Expose the inlining macros to C only; C++ uses the real + * extern functions (defined in the matching lib/msun//fenv.c). + */ +#ifndef __cplusplus #define feclearexcept(a) __feclearexcept_int(a) #define fegetexceptflag(e, a) __fegetexceptflag_int(e, a) #define fesetexceptflag(e, a) __fesetexceptflag_int(e, a) @@ -134,6 +143,7 @@ int feupdateenv(const fenv_t *); #define feholdexcept(e) __feholdexcept_int(e) #define fesetenv(e) __fesetenv_int(e) #define feupdateenv(e) __feupdateenv_int(e) +#endif /* !__cplusplus */ __fenv_static inline int __feclearexcept_int(int __excepts) @@ -266,8 +276,10 @@ __feupdateenv_int(const fenv_t *__envp) int feenableexcept(int); int fedisableexcept(int); +#ifndef __cplusplus /* see the note above; C++ uses the real functions */ #define feenableexcept(a) __feenableexcept_int(a) #define fedisableexcept(a) __fedisableexcept_int(a) +#endif __fenv_static inline int __feenableexcept_int(int __mask) diff --git a/lib/msun/riscv/fenv.h b/lib/msun/riscv/fenv.h index 1059744941f3..199ca1806684 100644 --- a/lib/msun/riscv/fenv.h +++ b/lib/msun/riscv/fenv.h @@ -91,6 +91,15 @@ int feholdexcept(fenv_t *); int fesetenv(const fenv_t *); int feupdateenv(const fenv_t *); +/* + * C permits a standard library function to also be exposed as a function-like + * macro (C23 7.1.4), and msun uses that here to inline the fast path. C++ + * forbids it: imports these names into namespace std (using + * ::feclearexcept; etc.), so std::feclearexcept() and friends must denote the + * actual functions. Expose the inlining macros to C only; C++ uses the real + * extern functions (defined in the matching lib/msun//fenv.c). + */ +#ifndef __cplusplus #define feclearexcept(a) __feclearexcept_int(a) #define fegetexceptflag(e, a) __fegetexceptflag_int(e, a) #define fesetexceptflag(e, a) __fesetexceptflag_int(e, a) @@ -102,6 +111,7 @@ int feupdateenv(const fenv_t *); #define feholdexcept(e) __feholdexcept_int(e) #define fesetenv(e) __fesetenv_int(e) #define feupdateenv(e) __feupdateenv_int(e) +#endif /* !__cplusplus */ __fenv_static inline int __feclearexcept_int(int __excepts) @@ -224,8 +234,10 @@ __feupdateenv_int(const fenv_t *__envp) int feenableexcept(int); int fedisableexcept(int); +#ifndef __cplusplus /* see the note above; C++ uses the real functions */ #define feenableexcept(a) __feenableexcept_int(a) #define fedisableexcept(a) __fedisableexcept_int(a) +#endif __fenv_static inline int __feenableexcept_int(int __mask __unused) diff --git a/lib/msun/x86/fenv.h b/lib/msun/x86/fenv.h index b5da37902083..cb44624a858a 100644 --- a/lib/msun/x86/fenv.h +++ b/lib/msun/x86/fenv.h @@ -150,12 +150,22 @@ int fesetround(int); int fegetround(void); int fesetenv(const fenv_t *); +/* + * C permits a standard library function to also be exposed as a function-like + * macro (C23 7.1.4), and msun uses that here to inline the fast path. C++ + * forbids it: imports these names into namespace std (using + * ::feclearexcept; etc.), so std::feclearexcept() and friends must denote the + * actual functions. Expose the inlining macros to C only; C++ uses the real + * extern functions (defined in the matching lib/msun//fenv.c). + */ +#ifndef __cplusplus #define feclearexcept(a) __feclearexcept_int(a) #define fegetexceptflag(e, a) __fegetexceptflag_int(e, a) #define fetestexcept(a) __fetestexcept_int(a) #define fesetround(a) __fesetround_int(a) #define fegetround() __fegetround_int() #define fesetenv(a) __fesetenv_int(a) +#endif /* !__cplusplus */ #ifdef __i386__