[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH] fwrite: silence __wur without using inline



The libvirt folks reported[1] a link error of multiple rpl_fwrite
definitions that hits only when optimization and FORTIFY_SOURCE
are both enabled, due to improper use of inline.  But since that
particular use of rpl_fwrite exists only to work around a spurious
gcc warning on some versions of glibc, we can use gcc extensions
to acheive the same effect without using inline.  This approach
copies the method used in ignore-value.h.

[1] https://lists.gnu.org/archive/html/bug-gnulib/2013-01/msg00014.html

* lib/stdio.in.h (fwrite): Limit warn_unused_result workaround to
just gcc, and in a way that avoids inline issues.
* modules/stdio (Depends-on): Drop extern-inline.

Signed-off-by: Eric Blake <eblake redhat com>
---
 ChangeLog      |  7 +++++++
 lib/stdio.in.h | 23 +++++------------------
 modules/stdio  |  1 -
 3 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 73c186d..0bae990 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-01-03  Eric Blake  <eblake redhat com>
+
+	fwrite: silence __wur without using inline
+	* lib/stdio.in.h (fwrite): Limit warn_unused_result workaround to
+	just gcc, and in a way that avoids inline issues.
+	* modules/stdio (Depends-on): Drop extern-inline.
+
 2013-01-03  Jim Meyering  <jim meyering net>

 	update-copyright: avoid copyright notice date corruption
diff --git a/lib/stdio.in.h b/lib/stdio.in.h
index ec39c7d..0f20171 100644
--- a/lib/stdio.in.h
+++ b/lib/stdio.in.h
@@ -46,11 +46,6 @@
 #ifndef _ GUARD_PREFIX@_STDIO_H
 #define _ GUARD_PREFIX@_STDIO_H

-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_STDIO_INLINE
-# define _GL_STDIO_INLINE _GL_INLINE
-#endif
-
 /* Get va_list.  Needed on many systems, including glibc 2.8.  */
 #include <stdarg.h>

@@ -583,18 +578,12 @@ _GL_CXXALIAS_SYS (fwrite, size_t,
 /* Work around glibc bug 11959
    <http://sources.redhat.com/bugzilla/show_bug.cgi?id=11959>,
    which sometimes causes an unwanted diagnostic for fwrite calls.
-   This affects only function declaration attributes, so it's not
-   needed for C++.  */
-#  if !defined __cplusplus && 0 < __USE_FORTIFY_LEVEL
-_GL_STDIO_INLINE size_t _GL_ARG_NONNULL ((1, 4))
-rpl_fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
-{
-  size_t r = fwrite (ptr, s, n, stream);
-  (void) r;
-  return r;
-}
+   This affects only function declaration attributes under certain
+   versions of gcc, and is not needed for C++.  */
+#  if !defined __cplusplus && 0 < __USE_FORTIFY_LEVEL \
+  && 3 < (__GNUC__ + (4 <= __GNUC_MINOR__))
 #   undef fwrite
-#   define fwrite rpl_fwrite
+#   define fwrite(a, b, c, d) ({size_t __r = fwrite (a, b, c, d); __r; })
 #  endif
 # endif
 _GL_CXXALIASWARN (fwrite);
@@ -1338,8 +1327,6 @@ _GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
                       "POSIX compliance");
 #endif

-_GL_INLINE_HEADER_END
-
 #endif /* _ GUARD_PREFIX@_STDIO_H */
 #endif /* _ GUARD_PREFIX@_STDIO_H */
 #endif
diff --git a/modules/stdio b/modules/stdio
index c33ad31..54189dc 100644
--- a/modules/stdio
+++ b/modules/stdio
@@ -7,7 +7,6 @@ lib/stdio.in.h
 m4/stdio_h.m4

 Depends-on:
-extern-inline
 include_next
 snippet/arg-nonnull
 snippet/c++defs
-- 
1.8.0.2


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]