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;
+}