[PATCH] assert: Support assert as variadic macro for C++26 [PR27276]
Jonathan Wakely
jwakely@redhat.com
Thu Feb 5 15:59:49 GMT 2026
On Thu, 5 Feb 2026 at 15:56, Florian Weimer <fweimer@redhat.com> wrote:
>
> * Jonathan Wakely:
>
> > On Thu, 5 Feb 2026 at 15:40, Tomasz Kaminski <tkaminsk@redhat.com> wrote:
> >>
> >>
> >>
> >> On Thu, Feb 5, 2026 at 4:36 PM Florian Weimer <fweimer@redhat.com> wrote:
> >>>
> >>> * Tomasz Kamiński:
> >>>
> >>> > +# if __ASSERT_VARIADIC
> >>> > +# define assert(...) \
> >>> > + ((__VA_ARGS__) \
> >>> > + ? (void)(1 ? 1 : bool(__VA_ARGS__)) \
> >>> > + : __assert_fail (#__VA_ARGS__, __ASSERT_FILE, __ASSERT_LINE, \
> >>> > + __ASSERT_FUNCTION))
> >>>
> >>> Doesn't this evaluate __VA_ARGS__ multiple times?
> >>
> >> I got the same question initially when I saw this solution, but
> >> the second bool(__VA_ARGS) is in the false branch of the ternary:
> >> 1 ? 1 : bool(__VA_ARGS__)
> >> So it is never evaluated.
> >
> > Right, it's never evaluated, it's only there to enforce that
> > __VA_ARGS__ expands to a single expression, because bool(x,y) is
> > ill-formed.
>
> Ahh, we used sizeof for that before. And static_cast<bool> (…).
No and no. See the email that I just sent.
sieof imposes other restrictions, because certain C++ constructs are
ill-formed if they occur in a sizeof expression. Specifically co_await
and co_return. Now there's no reason to every use those in the
expression used with assert, but there's also no reason to use sizeof
when we can use the less restricted bool(__VA_ARGS__) construct
instead.
And static_cast<bool>(...) will convert scoped enums, which we don't want.
enum class E { e1 };
assert(e1); // this should not compile
> Would it make sense to keep that? Current GCC seems to warn for
> bool (…), too, and Clang warns for neither, so the new approach
> is probably okay as well.
>
> Thanks,
> Florian
>
More information about the Libc-alpha
mailing list