From 939dedd9a2fba934e5ff0313155f9f5f39cb6f6f Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Thu, 6 Jan 2011 15:41:16 -0700 Subject: [PATCH] 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 --- ChangeLog | 6 +++ lib/ignore-value.h | 9 ++-- modules/ignore-value-tests | 10 +++++ tests/test-ignore-value.c | 84 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 modules/ignore-value-tests create mode 100644 tests/test-ignore-value.c diff --git a/ChangeLog b/ChangeLog index d233fb72bf..c3856f1559 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-01-06 Eric Blake + 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 diff --git a/lib/ignore-value.h b/lib/ignore-value.h index 8f60b0e60d..52804dc23b 100644 --- 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 diff --git a/modules/ignore-value-tests b/modules/ignore-value-tests new file mode 100644 index 0000000000..e79478f249 --- /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 diff --git a/tests/test-ignore-value.c b/tests/test-ignore-value.c new file mode 100644 index 0000000000..a1c86e0148 --- /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 . */ + +/* Written by Eric Blake. */ + +#include + +#include "ignore-value.h" + +#include + +#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; +} -- 2.30.2