Mercurial > hg > octave-nkf > gnulib-hg
changeset 14141:bc576551c57c
ignore-value: support aggregate types
Also has the advantage of avoiding problems with
gcc -Wbad-function-cast
* lib/ignore-value.h (ignore_value): Provide separate gcc
definition.
* modules/ignore-value-tests: New test module.
* tests/test-ignore-value.c: New test.
Signed-off-by: Eric Blake <eblake@redhat.com>
author | Eric Blake <eblake@redhat.com> |
---|---|
date | Thu, 06 Jan 2011 15:41:16 -0700 |
parents | 1ca84334d3eb |
children | 39695edaade5 |
files | ChangeLog lib/ignore-value.h modules/ignore-value-tests tests/test-ignore-value.c |
diffstat | 4 files changed, 105 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-01-06 Eric Blake <eblake@redhat.com> + ignore-value: support aggregate types + * lib/ignore-value.h (ignore_value): Provide separate gcc + definition. + * modules/ignore-value-tests: New test module. + * tests/test-ignore-value.c: New test. + maint.mk: improve sc_prohibit_strcmp regex * top/maint.mk (sc_prohibit_strcmp): Detect strcmp()!=0, as documented. Also, detect strcmp((expr),expr) == 0. Exempt the
--- a/lib/ignore-value.h +++ b/lib/ignore-value.h @@ -47,13 +47,14 @@ # endif # endif -static inline void _ignore_value (intptr_t p) { (void) p; } -# define ignore_value(x) _ignore_value ((intptr_t) x) +# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1) +# define ignore_value(x) ((void) (x)) +# else +# define ignore_value(x) (({ __typeof__ (x) __x = (x); (void) __x; })) +# endif /* ignore_value works for both scalars and pointers; deprecate ignore_ptr. */ static inline void ATTRIBUTE_DEPRECATED ignore_ptr (void *p) { (void) p; } /* deprecated: use ignore_value */ -/* FIXME: what about aggregate types? */ - #endif
new file mode 100644 --- /dev/null +++ b/modules/ignore-value-tests @@ -0,0 +1,10 @@ +Files: +tests/test-ignore-value.c + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-ignore-value +check_PROGRAMS += test-ignore-value
new file mode 100644 --- /dev/null +++ b/tests/test-ignore-value.c @@ -0,0 +1,84 @@ +/* Test the "ignore-value" module. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Written by Eric Blake. */ + +#include <config.h> + +#include "ignore-value.h" + +#include <stdio.h> + +#ifndef ATTRIBUTE_RETURN_CHECK +# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1) +# define ATTRIBUTE_RETURN_CHECK +# else +# define ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__)) +# endif +#endif + +struct s { int i; }; +static char doChar (void) ATTRIBUTE_RETURN_CHECK; +static int doInt (void) ATTRIBUTE_RETURN_CHECK; +static off_t doOff (void) ATTRIBUTE_RETURN_CHECK; +static void *doPtr (void) ATTRIBUTE_RETURN_CHECK; +static struct s doStruct (void) ATTRIBUTE_RETURN_CHECK; + +static char +doChar (void) +{ + return 0; +} + +static int +doInt (void) +{ + return 0; +} + +static off_t +doOff (void) +{ + return 0; +} + +static void * +doPtr (void) +{ + return NULL; +} + +static struct s +doStruct (void) +{ + static struct s s1; + return s1; +} + +int +main (void) +{ + /* If this test can compile with -Werror and the same warnings as + the rest of the project, then we are properly silencing warnings + about ignored return values. */ + ignore_value (doChar ()); + ignore_value (doInt ()); + ignore_value (doOff ()); + ignore_value (doPtr ()); + ignore_value (doStruct ()); + return 0; +}