mirror of
https://sourceware.org/git/glibc.git
synced 2025-11-15 15:21:18 +03:00
C23 makes assert into a variadic macro to handle cases of an argument that would be interpreted as a single function argument but more than one macro argument (in particular, compound literals with an unparenthesized comma in an initializer list); this change was made by N2829. Note that this only applies to assert, not to other macros specified in the C standard with particular numbers of arguments. Implement this support in glibc. This change is only for C; C++ would need a separate change to its separate assert implementations. It's also applied only in C23 mode. It depends on support for (C99) variadic macros, and also (in order to detect calls where more than one expression is passed, via an unevaluated function call) a C99 boolean type. These requirements are encapsulated in the definition of __ASSERT_VARIADIC. Tests with -std=c99 and -std=gnu99 (using implementations continue to work. I don't think we have a way in the glibc testsuite to validate that passing more than one expression as an argument does produce the desired error. Tested for x86_64.
51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
/* Test assert as a variadic macro.
|
|
Copyright (C) 2025 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
#undef NDEBUG
|
|
#include <assert.h>
|
|
|
|
static void
|
|
test1 (void)
|
|
{
|
|
/* This is two macro arguments, but one function argument, so must
|
|
be accepted for C23. */
|
|
assert ((int [2]) { 0, 1 }[1]);
|
|
}
|
|
|
|
#define NDEBUG
|
|
#include <assert.h>
|
|
|
|
static void
|
|
test2 (void)
|
|
{
|
|
/* With NDEBUG, arbitrary sequences of tokens are valid as assert
|
|
arguments; they do not need to form a single expression. */
|
|
assert (1, 2, 3, *);
|
|
assert ();
|
|
}
|
|
|
|
static int
|
|
do_test (void)
|
|
{
|
|
test1 ();
|
|
test2 ();
|
|
return 0;
|
|
}
|
|
|
|
#include <support/test-driver.c>
|