From nobody Mon Jun 24 15:41:04 2024 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 4W7ByQ5g4qz5P7gb for ; Mon, 24 Jun 2024 15:41:18 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: from mail-pg1-x532.google.com (mail-pg1-x532.google.com [IPv6:2607:f8b0:4864:20::532]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "WR4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4W7ByP6yCwz4JWX for ; Mon, 24 Jun 2024 15:41:17 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Authentication-Results: mx1.freebsd.org; none Received: by mail-pg1-x532.google.com with SMTP id 41be03b00d2f7-6c4926bf9baso3688956a12.2 for ; Mon, 24 Jun 2024 08:41:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20230601.gappssmtp.com; s=20230601; t=1719243675; x=1719848475; darn=freebsd.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=3SWFBNJJ+tANQ4vRbNHngitEDQcfZz8Cwo7TuUdn85c=; b=J3zWKRM3muCXwtd4LSeelvtGfSI6yAa+cMrciyatwBf7WXELXhU99ugUiJ06e97KWU tYRV+Xu6MMpi4xDX6JdYgJNJFF1LlX6UvscM/rtPFvyU/qkKIbs5wqJC8mFVetgmttbh kbNOJ/JKM7AvVOAD2nj/EDMiQqgGtPj01NEPYRWMM6iKJyajKiM0DLDeTKzJQbNbGNLf PdzRxOEFJg4PDBBHq2XIClBcXdqP4HvujkEpEZteDdRoLCERc9mYSzjjRxXm0BPzCcCO Zi4ZCPOZWkCs/ZoDDVB4FHPWhsPVxP6nABuhWIhwNKk8+ksfHI546PcgNEvcuOcE2Ac3 8KDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719243675; x=1719848475; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=3SWFBNJJ+tANQ4vRbNHngitEDQcfZz8Cwo7TuUdn85c=; b=VTzRJdRxbkjAe4akNVdivEV+zNuO1aPoImX0op7/b5R9+Z2peECKCAx7cw20JLEy0X ME49IvYMp4znZAhcbt7fr29+KAs6xjJJ37p7mgMysoscmb9iRyJpTGhteJeJMTKQflX/ m521m6cYuZ6Ftsd/EyVlX1wpFWkGPbP5lx6SPJeFE4QjG6ZHPfVVrckZcywLmWvVhmu8 E7Mh+9l8gU+PwSsfo2042115U+yd8+HSTwgnsYAGY4/67alhDZwfzjamaW/zjAFOA93M FP94gVv454ETl/5IsKZ4uNbZkF4K+Ig731nvp6G/DqCgvjubETKBstJYwPLxX2CRtGm/ a0dw== X-Forwarded-Encrypted: i=1; AJvYcCWHiEjqnqYBJiQnlMbXmODxiwDuTEcLDcy8K9/nf/bUW8s3ah1uKKcp0+nRmc/QZUNc2rrKpTZIri21d0hx5qmR/CvjB8pnOytId68JT3Rb X-Gm-Message-State: AOJu0YyOT+BStA3IQkMqUZ4XdYbzOGJSMq5ybsjH5Ep7OHQG/zZeMxJ4 vfdmKVjQjhyj0rztOAbUjKPlClKh5L0ihlml4fsWXYhUrkQOlr7utwnCjYDdJdVzXomjf1AKshm tlAurlC9YLHyIHsDHA7Tm6++uiERLC5T4+G9gOA== X-Google-Smtp-Source: AGHT+IHY7UJFFGbkWg2iKVp9mMKlAwrxGWQBqSgBckL/7XOtQbIMlXyGY9KM+HAhijkIOgDyaK9p6G30MfS4GbZ3sM0= X-Received: by 2002:a17:90b:20c:b0:2c8:5cb3:42b6 with SMTP id 98e67ed59e1d1-2c85cb343f8mr4493590a91.8.1719243675559; Mon, 24 Jun 2024 08:41:15 -0700 (PDT) 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 MIME-Version: 1.0 References: <202406210241.45L2fQZA057110@gitrepo.freebsd.org> <111875645.165697.1719082066518@mail.yahoo.com> <62379069.705510.1719242645494@mail.yahoo.com> In-Reply-To: <62379069.705510.1719242645494@mail.yahoo.com> From: Warner Losh Date: Mon, 24 Jun 2024 09:41:04 -0600 Message-ID: Subject: Re: git: d5c01e1124ff - main - cdefs.h: Remove pre gcc 5.0 support To: Pedro Giffuni Cc: "src-committers@freebsd.org" , "dev-commits-src-all@freebsd.org" , "dev-commits-src-main@freebsd.org" , Warner Losh Content-Type: multipart/alternative; boundary="00000000000090863b061ba49c5f" X-Spamd-Bar: ---- X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US] X-Rspamd-Queue-Id: 4W7ByP6yCwz4JWX --00000000000090863b061ba49c5f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jun 24, 2024 at 9:25=E2=80=AFAM Pedro Giffuni wro= te: > I do welcome the cleanup, of course, just I would have defined GCC 4.2 as > the breaking point instead of 5.0. > The breaking point is headed to gcc9 and clang11. There's no compelling FreeBSD project use case where people need to compile FreeBSD programs with compilers older than that. Though the difference matters mostly to compiling FreeBSD itself (which doesn't work with gcc older than 12 or 13 or clang older than a couple of releases. The delta for the system headers is approximately 0 for all these changes, though, since most of the #defines are for FreeBSD itself, not our headers. > Due basically to the licensing issues, GCC 4.2 became a natural reference > for GCC versions. At some point there were vendors actually shipping > FreeBSD with GCC 4.2, and it was not a huge cost to keep GCC versions > above 4.2 properly discriminated. > True... But that's ancient history at this point... > But then you are right that it doesn't really matter that much. At least > the alloc_size attributes are only defined for the FORTIFY_SOURCE in some > linux libc implementation that I looked at. We define them unconditionall= y > but I don't recall them being useful. > We use them in a few dozen places in the tree, but the only visible ones to system headers are for malloc, calloc and realloc. Keeping the fringe definitions wasn't too useful, but if they turn out to be less than fringe, I'll cope. Most of the odd edge cases we had, though, were poorly documented and/or had the versions wrong because of transient bugs in gcc. :(. It's time to start over. Of course, sys/cdefs.h could also benefit from some reorg, and a man page, but one thing at a time. Warner Indeed. But none of the ones that I removed are affected by this quirk > since they are true for clang all versions. > > Warner > > On Sat, Jun 22, 2024 at 12:47=E2=80=AFPM Pedro Giffuni = wrote: > > It was long ago when I last touched this but FWIW ... > > clang used to report itself as GCC 4.2 and kept it's GCC extension suppor= t > level consistent with that version so these version numbers were relevant= . > > Pedro. > > On Thursday, June 20, 2024 at 09:41:34 PM GMT-5, Warner Losh < > imp@freebsd.org> wrote: > > > The branch main has been updated by imp: > > URL: > https://cgit.FreeBSD.org/src/commit/?id=3Dd5c01e1124ffa4adb2513e7e8d708d7= 072dbfc75 > > commit d5c01e1124ffa4adb2513e7e8d708d7072dbfc75 > Author: Warner Losh > AuthorDate: 2024-06-20 23:03:15 +0000 > Commit: Warner Losh > CommitDate: 2024-06-21 02:41:09 +0000 > > cdefs.h: Remove pre gcc 5.0 support > > Reviewed by: brooks > Differential Revision: https://reviews.freebsd.org/D45656 > Sponsored by: Netflix > --- > sys/sys/cdefs.h | 54 ----------------------------------------------------= -- > 1 file changed, 54 deletions(-) > > diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h > index a6ecdca5d8b9..43d179b82020 100644 > --- a/sys/sys/cdefs.h > +++ b/sys/sys/cdefs.h > @@ -164,18 +164,9 @@ > #define __aligned(x) __attribute__((__aligned__(x))) > #define __section(x) __attribute__((__section__(x))) > #define __writeonly __unused > -#if __GNUC_PREREQ__(4, 3) || __has_attribute(__alloc_size__) > #define __alloc_size(x) __attribute__((__alloc_size__(x))) > #define __alloc_size2(n, x) __attribute__((__alloc_size__(n, x))) > -#else > -#define __alloc_size(x) > -#define __alloc_size2(n, x) > -#endif > -#if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__) > #define __alloc_align(x) __attribute__((__alloc_align__(x))) > -#else > -#define __alloc_align(x) > -#endif > > /* > * Keywords added in C11. > @@ -199,15 +190,6 @@ > #define _Alignof(x) __alignof(x) > #endif > > -#if !defined(__cplusplus) && !__has_extension(c_atomic) && \ > - !__has_extension(cxx_atomic) && !__GNUC_PREREQ__(4, 7) > -/* > - * No native support for _Atomic(). Place object in structure to prevent > - * most forms of direct non-atomic access. > - */ > -#define _Atomic(T) struct { T volatile __val; } > -#endif > - > #if defined(__cplusplus) && __cplusplus >=3D 201103L > #define _Noreturn [[noreturn]] > #else > @@ -218,15 +200,6 @@ > #if (defined(__cplusplus) && __cplusplus >=3D 201103L) || \ > __has_extension(cxx_static_assert) > #define _Static_assert(x, y) static_assert(x, y) > -#elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus) > -/* Nothing, gcc 4.6 and higher has _Static_assert built-in */ > -#elif defined(__COUNTER__) > -#define _Static_assert(x, y) __Static_assert(x, __COUNTER__) > -#define __Static_assert(x, y) ___Static_assert(x, y) > -#define ___Static_assert(x, y) typedef char __assert_ ## y[(x) ? 1 > : -1] \ > - __unused > -#else > -#define _Static_assert(x, y) struct __hack > #endif > #endif > > @@ -276,7 +249,6 @@ > * void bar(int myArray[__min_size(10)]); > */ > #if !defined(__cplusplus) && \ > - (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \ > (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >=3D 199901)) > #define __min_size(x) static (x) > #else > @@ -302,17 +274,9 @@ > #define __result_use_or_ignore_check > #endif /* !__clang__ */ > > -#if __GNUC_PREREQ__(4, 1) > #define __returns_twice __attribute__((__returns_twice__)) > -#else > -#define __returns_twice > -#endif > > -#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable) > #define __unreachable() __builtin_unreachable() > -#else > -#define __unreachable() ((void)0) > -#endif > > #if !defined(__STRICT_ANSI__) || __STDC_VERSION__ >=3D 199901 > #define __LONG_LONG_SUPPORTED > @@ -353,33 +317,15 @@ > #define __predict_true(exp) __builtin_expect((exp), 1) > #define __predict_false(exp) __builtin_expect((exp), 0) > > -#if __GNUC_PREREQ__(4, 0) > #define __null_sentinel __attribute__((__sentinel__)) > #define __exported __attribute__((__visibility__("default"))) > #define __hidden __attribute__((__visibility__("hidden"))) > -#else > -#define __null_sentinel > -#define __exported > -#define __hidden > -#endif > > /* > * We define this here since , , and > * require it. > */ > -#if __GNUC_PREREQ__(4, 1) > #define __offsetof(type, field) __builtin_offsetof(type, field) > -#else > -#ifndef __cplusplus > -#define __offsetof(type, field) \ > - ((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->field)= ) > -#else > -#define __offsetof(type, field) \ > - (__offsetof__ (reinterpret_cast <__size_t> \ > - (&reinterpret_cast \ > - (static_cast (0)->field)))) > -#endif > -#endif > #define __rangeof(type, start, end) \ > (__offsetof(type, end) - __offsetof(type, start)) > > --00000000000090863b061ba49c5f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


=
On Mon, Jun 24, 2024 at 9:25=E2=80=AF= AM Pedro Giffuni <pfg@freebsd.org= > wrote:
I do welcome the cleanup, of= course, just I would have defined GCC 4.2 as the breaking point instead of= 5.0.

= The breaking point is headed to gcc9 and clang11. There's no compelling= FreeBSD project use case where people need to compile FreeBSD programs wit= h compilers older than that. Though the difference matters mostly to compil= ing FreeBSD itself (which doesn't work with gcc older than 12 or 13 or = clang older than a couple of releases. The delta for the system headers is = approximately 0 for all these changes, though, since most of the #defines a= re for FreeBSD itself, not our headers.
=C2=A0
Due basically to the licensing issues, GCC 4.2 became a natural refere= nce for GCC versions.=C2=A0 At some point there were vendors actually shipp= ing FreeBSD with GCC 4.2, and it was not a huge cost to keep GCC versions above 4.2 properly discriminate= d.

True... = But that's ancient history at this point...
=C2=A0
But then you are = right that it doesn't really matter that much. At least the alloc_size = attributes are only defined for the FORTIFY_SOURCE in some linux libc imple= mentation that I looked at. We define them unconditionally but I don't = recall them being useful.
=
We use them in a few dozen places in the tree, but the only = visible ones to system headers are for malloc, calloc and realloc. Keeping = the fringe definitions wasn't too useful, but if they turn out to be le= ss than fringe, I'll cope. Most of the odd edge cases we had, though, w= ere poorly documented and/or had the versions wrong because of transient bu= gs in gcc. :(. It's time to start over.

Of cou= rse, sys/cdefs.h could also benefit from some reorg, and a man page, but on= e thing at a time.

Warner

Indeed. But none of the ones that I removed are affected by this qu= irk since they are true for clang all versions.

Warner

On Sat, Jun 22,= 2024 at 12:47=E2=80=AFPM Pedro Giffuni <pfg@freebsd.org&g= t; wrote:
It was long ago when I last touched this but FWIW = ...

clang used to report itself as GCC 4.2 and kept it's GCC ex= tension support level consistent with that version so these version numbers= were relevant.

Pedro.

=20
=20
On Thursday, June 20, 2024 at 09:41:34 PM GMT-5, Wa= rner Losh <imp@freebsd.org> wrote:


=20 =20
The branch main has been updated by i= mp:


commit d5c01e1124ffa4adb2513e7e8d708d7072d= bfc75
Author:=C2=A0 =C2=A0 Warner= Losh <imp@FreeBSD.org>
AuthorDate: 2024-06-20 23:03:15 +0000
Commit:=C2=A0 =C2=A0 Warner Losh <imp@FreeBSD.= org>
CommitDate: 2024-06-21= 02:41:09 +0000

=C2=A0 =C2=A0 cdefs.h: Remove pre gcc 5.0 support
=C2=A0 =C2=A0
=C2=A0 =C2=A0 Reviewed by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 brooks
=C2=A0 =C2=A0= Differential Revision:=C2=A0 https://reviews.freebsd= .org/D45656
=C2=A0 =C2=A0 Spon= sored by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Netflix
---
sys/sys/cd= efs.h | 54 ------------------------------------------------------
1 file changed, 54 deletions(-)

= diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h
index a6ecdca5d8b9..43d179b82020 100644
--- a/sys/sys/cdefs.h
+++ b/sys/sys/cdefs.h
@@ = -164,18 +164,9 @@
#define=C2=A0= =C2=A0=C2=A0 __aligned(x)=C2=A0=C2=A0=C2=A0 __attribute__((__aligned__(x)))=
#define=C2=A0=C2=A0=C2=A0 __sect= ion(x)=C2=A0=C2=A0=C2=A0 __attribute__((__section__(x)))
=
#define=C2=A0=C2=A0=C2=A0 __writeonly=C2=A0=C2=A0= =C2=A0 __unused
-#if __GNUC_PREREQ= __(4, 3) || __has_attribute(__alloc_size__)
#define=C2=A0=C2=A0=C2=A0 __alloc_size(x)=C2=A0=C2=A0=C2=A0 __at= tribute__((__alloc_size__(x)))
#d= efine=C2=A0=C2=A0=C2=A0 __alloc_size2(n, x)=C2=A0=C2=A0=C2=A0 __attribute__= ((__alloc_size__(n, x)))
-#else
-#define=C2=A0=C2=A0=C2=A0 __alloc_s= ize(x)
-#define=C2=A0=C2=A0=C2=A0 = __alloc_size2(n, x)
-#endif
-#if __GNUC_PREREQ__(4, 9) || __has_attr= ibute(__alloc_align__)
#define=C2= =A0=C2=A0=C2=A0 __alloc_align(x)=C2=A0=C2=A0=C2=A0 __attribute__((__alloc_a= lign__(x)))
-#else
-#define=C2=A0=C2=A0=C2=A0 __alloc_align(x)
-#endif

/*
=
=C2=A0 * Keywords added in C11.
@@ -199,15 +190,6 @@
#define=C2=A0=C2=A0=C2=A0 _Alignof(x)=C2=A0=C2=A0=C2=A0 =C2=A0=C2= =A0=C2=A0 __alignof(x)
#endif

-#if !defined(__cplusplus) && !__has_extension(c_atomic) &= ;& \
-=C2=A0=C2=A0=C2=A0 !__ha= s_extension(cxx_atomic) && !__GNUC_PREREQ__(4, 7)
-/*
- * No= native support for _Atomic(). Place object in structure to prevent
- * most forms of direct non-atomic acces= s.
- */
-#define=C2=A0=C2=A0=C2=A0 _Atomic(T)=C2=A0=C2=A0=C2=A0 =C2= =A0=C2=A0=C2=A0 struct { T volatile __val; }
-#endif
-
#if defined(__cplusplus) && __cplusplu= s >=3D 201103L
#define=C2=A0= =C2=A0=C2=A0 _Noreturn=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 [[noreturn]]
#else
@@ -218,15 +200,6 @@
= #if (defined(__cplusplus) && __cplusplus >=3D 201103L) || \
=C2=A0 =C2=A0 __has_extension(cxx_sta= tic_assert)
#define=C2=A0=C2=A0= =C2=A0 _Static_assert(x, y)=C2=A0=C2=A0=C2=A0 static_assert(x, y)
-#elif __GNUC_PREREQ__(4,6) && !de= fined(__cplusplus)
-/* Nothing, gc= c 4.6 and higher has _Static_assert built-in */
-#elif defined(__COUNTER__)
-#define=C2=A0=C2=A0=C2=A0 _Static_assert(x, y)=C2=A0=C2=A0=C2=A0 = __Static_assert(x, __COUNTER__)
-#= define=C2=A0=C2=A0=C2=A0 __Static_assert(x, y)=C2=A0=C2=A0=C2=A0 ___Static_= assert(x, y)
-#define=C2=A0=C2=A0= =C2=A0 ___Static_assert(x, y)=C2=A0=C2=A0=C2=A0 typedef char __assert_ ## y= [(x) ? 1 : -1] \
-=C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 __unused
-#else
-#define=C2=A0=C2=A0=C2=A0 _Static_assert(x, y)=C2=A0=C2=A0=C2=A0 = struct __hack
#endif
#endif

@@ -276,7 +249,6 @@
=C2=A0 * void bar(int myArray[__min_size(1= 0)]);
=C2=A0 */
=
#if !defined(__cplusplus) && \
-=C2=A0 =C2=A0 (defined(__clang__) || __GNUC_P= REREQ__(4, 6)) && \
=C2=A0= =C2=A0 (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >=3D 199901))<= br clear=3D"none">
#define __min_size(x)=C2=A0=C2=A0= =C2=A0 static (x)
#else
@@ -302,17 +274,9 @@
#define=C2=A0=C2=A0=C2=A0 __result_use_or_ignore_check=
#endif /* !__clang__ */

-#if __GNUC_PREREQ__(4, 1)
#defi= ne=C2=A0=C2=A0=C2=A0 __returns_twice=C2=A0=C2=A0=C2=A0 __attribute__((__ret= urns_twice__))
-#else
-#define=C2=A0=C2=A0=C2=A0 __returns_twice
-#endif

-#if __GNUC_PREREQ__= (4, 6) || __has_builtin(__builtin_unreachable)
#define=C2=A0=C2=A0=C2=A0 __unreachable()=C2=A0=C2=A0=C2=A0 _= _builtin_unreachable()
-#else
-#define=C2=A0=C2=A0=C2=A0 __unreachab= le()=C2=A0=C2=A0=C2=A0 ((void)0)
-= #endif

<= div dir=3D"ltr"> #if !defined(__STRICT_ANSI__) || __STDC_VERSION__ >=3D = 199901
#define=C2=A0=C2=A0=C2=A0 = __LONG_LONG_SUPPORTED
@@ -353,33 += 317,15 @@
#define=C2=A0=C2=A0=C2= =A0 __predict_true(exp)=C2=A0 =C2=A0 __builtin_expect((exp), 1)
#define=C2=A0=C2=A0=C2=A0 __predict_false= (exp)=C2=A0 =C2=A0 __builtin_expect((exp), 0)

-#if __GNUC_PREREQ__= (4, 0)
#define=C2=A0=C2=A0=C2=A0 = __null_sentinel=C2=A0=C2=A0=C2=A0 __attribute__((__sentinel__))
#define=C2=A0=C2=A0=C2=A0 __exported=C2=A0= =C2=A0=C2=A0 __attribute__((__visibility__("default")))
#define=C2=A0=C2=A0=C2=A0 __hidden=C2=A0= =C2=A0=C2=A0 __attribute__((__visibility__("hidden")))
-#else
-#define=C2=A0=C2=A0=C2=A0 __null_sentinel
-#define=C2=A0=C2=A0=C2=A0 __exported
-#define=C2=A0=C2=A0=C2=A0 __hidden
-#endif

/*
=C2=A0 * We define this here since <stddef.h>, <sys/queue= .h>, and <sys/types.h>
= =C2=A0 * require it.
=C2=A0 */
-#if __GNUC_PREREQ__(4, 1)
#define=C2=A0=C2=A0=C2=A0 __offsetof(type= , field)=C2=A0=C2=A0=C2=A0 __builtin_offsetof(type, field)
-#else
-= #ifndef __cplusplus
-#define=C2=A0= =C2=A0=C2=A0 __offsetof(type, field) \
-=C2=A0=C2=A0=C2=A0 ((__size_t)(__uintptr_t)((const volatile void *)&a= mp;((type *)0)->field))
-#else<= br clear=3D"none">
-#define=C2=A0=C2=A0=C2=A0 __offse= tof(type, field)=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 = =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 \
-=C2=A0 (__offsetof__ (reinterpret_cast <__size_t>=C2=A0=C2=A0= =C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 \
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (&am= p;reinterpret_cast <const volatile char &>=C2=A0=C2=A0=C2=A0 \
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 (static_cast<type *> (0)->field))))
-#endif
-#endif
#define=C2= =A0=C2=A0=C2=A0 __rangeof(type, start, end) \
=C2=A0=C2=A0=C2=A0 (__offsetof(type, end) - __offsetof(type, s= tart))

<= /div>
--00000000000090863b061ba49c5f--