Subject: merge from gnulib for extern-inline
From: Paul Eggert <[email-masked]>
To: [email-masked]
Cc: Juanma Barranquero <[email-masked]>, Eli Zaretskii <[email-masked]>
Date: Wed, 01 Aug 2012 15:18:51 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

Tags: patch

Here's a patch I plan to incorporate into Emacs after a bit more testing.
I'm CCing to Eli and to Juanma as it will most likely require
some change to the Microsoft-related build procedure, due to the three
new .c files under lib/.

=== modified file 'ChangeLog'
--- ChangeLog	2012-08-01 15:00:49 +0000
+++ ChangeLog	2012-08-01 22:11:58 +0000
@@ -1,3 +1,12 @@
+2012-08-01  Paul Eggert  <[email-masked]>
+
+	Merge from gnulib, incorporating:
+	2012-08-01 extern-inline: new module
+	2012-08-01 stat-time, timespec, u64, utimens: use extern-inline
+	* lib/stat-time.c, lib/utimespec.c, lib/u64.c, m4/extern-inline.m4:
+	New files.  The new .c files are for instantiating extern inline
+	functions.
+
 2012-08-01  Glenn Morris  <[email-masked]>
 
 	* configure.ac (DOS_NT, MSDOS): New system type templates.

=== modified file 'lib/gnulib.mk'
--- lib/gnulib.mk	2012-07-28 23:05:32 +0000
+++ lib/gnulib.mk	2012-08-01 22:11:58 +0000
@@ -465,6 +465,7 @@
 
 ## begin gnulib module stat-time
 
+libgnu_a_SOURCES += stat-time.c
 
 EXTRA_DIST += stat-time.h
 
@@ -1092,6 +1093,7 @@
 
 ## begin gnulib module timespec
 
+libgnu_a_SOURCES += timespec.c
 
 EXTRA_DIST += timespec.h
 
@@ -1111,6 +1113,7 @@
 
 ## begin gnulib module u64
 
+libgnu_a_SOURCES += u64.c
 
 EXTRA_DIST += u64.h

=== added file 'lib/stat-time.c'
--- lib/stat-time.c	1970-01-01 00:00:00 +0000
+++ lib/stat-time.c	2012-08-01 22:11:58 +0000
@@ -0,0 +1,3 @@
+#include <config.h>
+#define _GL_STAT_TIME_INLINE _GL_EXTERN_INLINE
+#include <stat-time.h>

=== modified file 'lib/stat-time.h'
--- lib/stat-time.h	2012-06-24 17:21:20 +0000
+++ lib/stat-time.h	2012-08-01 22:11:58 +0000
@@ -23,6 +23,11 @@
 #include <sys/stat.h>
 #include <time.h>
 
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_STAT_TIME_INLINE
+# define _GL_STAT_TIME_INLINE _GL_INLINE
+#endif
+
 /* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
    struct timespec, if available.  If not, then STAT_TIMESPEC_NS (ST,
    ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
@@ -46,7 +51,7 @@
 #endif
 
 /* Return the nanosecond component of *ST's access time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_atime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
@@ -59,7 +64,7 @@
 }
 
 /* Return the nanosecond component of *ST's status change time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_ctime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
@@ -72,7 +77,7 @@
 }
 
 /* Return the nanosecond component of *ST's data modification time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_mtime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
@@ -85,7 +90,7 @@
 }
 
 /* Return the nanosecond component of *ST's birth time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_birthtime_ns (struct stat const *st)
 {
 # if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
@@ -100,7 +105,7 @@
 }
 
 /* Return *ST's access time.  */
-static inline struct timespec
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_atime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
@@ -114,7 +119,7 @@
 }
 
 /* Return *ST's status change time.  */
-static inline struct timespec
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_ctime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
@@ -128,7 +133,7 @@
 }
 
 /* Return *ST's data modification time.  */
-static inline struct timespec
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_mtime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
@@ -143,7 +148,7 @@
 
 /* Return *ST's birth time, if available; otherwise return a value
    with tv_sec and tv_nsec both equal to -1.  */
-static inline struct timespec
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_birthtime (struct stat const *st)
 {
   struct timespec t;
@@ -186,4 +191,6 @@
   return t;
 }
 
+_GL_INLINE_HEADER_END
+
 #endif

=== added file 'lib/timespec.c'
--- lib/timespec.c	1970-01-01 00:00:00 +0000
+++ lib/timespec.c	2012-08-01 22:11:58 +0000
@@ -0,0 +1,3 @@
+#include <config.h>
+#define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE
+#include <timespec.h>

=== modified file 'lib/timespec.h'
--- lib/timespec.h	2012-07-09 08:34:39 +0000
+++ lib/timespec.h	2012-08-01 22:11:58 +0000
@@ -21,6 +21,11 @@
 
 # include <time.h>
 
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_TIMESPEC_INLINE
+# define _GL_TIMESPEC_INLINE _GL_INLINE
+#endif
+
 /* Return negative, zero, positive if A < B, A == B, A > B, respectively.
 
    For each time stamp T, this code assumes that either:
@@ -49,7 +54,7 @@
 
    The (int) cast avoids a gcc -Wconversion warning.  */
 
-static inline int
+_GL_TIMESPEC_INLINE int
 timespec_cmp (struct timespec a, struct timespec b)
 {
   return (a.tv_sec < b.tv_sec ? -1
@@ -59,7 +64,7 @@
 
 /* Return -1, 0, 1, depending on the sign of A.  A.tv_nsec must be
    nonnegative.  */
-static inline int
+_GL_TIMESPEC_INLINE int
 timespec_sign (struct timespec a)
 {
   return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec;
@@ -73,7 +78,7 @@
   _GL_ATTRIBUTE_CONST;
 
 /* Return an approximation to A, of type 'double'.  */
-static inline double
+_GL_TIMESPEC_INLINE double
 timespectod (struct timespec a)
 {
   return a.tv_sec + a.tv_nsec / 1e9;
@@ -82,4 +87,6 @@
 void gettime (struct timespec *);
 int settime (struct timespec const *);
 
+_GL_INLINE_HEADER_END
+
 #endif

=== added file 'lib/u64.c'
--- lib/u64.c	1970-01-01 00:00:00 +0000
+++ lib/u64.c	2012-08-01 22:11:58 +0000
@@ -0,0 +1,3 @@
+#include <config.h>
+#define _GL_U64_INLINE _GL_EXTERN_INLINE
+#include <u64.h>

=== modified file 'lib/u64.h'
--- lib/u64.h	2012-05-26 23:14:36 +0000
+++ lib/u64.h	2012-08-01 22:11:58 +0000
@@ -19,6 +19,11 @@
 
 #include <stdint.h>
 
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_U64_INLINE
+# define _GL_U64_INLINE _GL_INLINE
+#endif
+
 /* Return X rotated left by N bits, where 0 < N < 64.  */
 #define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n))
 
@@ -54,7 +59,7 @@
 
 /* Given the high and low-order 32-bit quantities HI and LO, return a u64
    value representing (HI << 32) + LO.  */
-static inline u64
+_GL_U64_INLINE u64
 u64hilo (uint32_t hi, uint32_t lo)
 {
   u64 r;
@@ -64,7 +69,7 @@
 }
 
 /* Return a u64 value representing LO.  */
-static inline u64
+_GL_U64_INLINE u64
 u64lo (uint32_t lo)
 {
   u64 r;
@@ -74,7 +79,7 @@
 }
 
 /* Return a u64 value representing SIZE.  */
-static inline u64
+_GL_U64_INLINE u64
 u64size (size_t size)
 {
   u64 r;
@@ -84,14 +89,14 @@
 }
 
 /* Return X < Y.  */
-static inline int
+_GL_U64_INLINE int
 u64lt (u64 x, u64 y)
 {
   return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo);
 }
 
 /* Return X & Y.  */
-static inline u64
+_GL_U64_INLINE u64
 u64and (u64 x, u64 y)
 {
   u64 r;
@@ -101,7 +106,7 @@
 }
 
 /* Return X | Y.  */
-static inline u64
+_GL_U64_INLINE u64
 u64or (u64 x, u64 y)
 {
   u64 r;
@@ -111,7 +116,7 @@
 }
 
 /* Return X ^ Y.  */
-static inline u64
+_GL_U64_INLINE u64
 u64xor (u64 x, u64 y)
 {
   u64 r;
@@ -121,7 +126,7 @@
 }
 
 /* Return X + Y.  */
-static inline u64
+_GL_U64_INLINE u64
 u64plus (u64 x, u64 y)
 {
   u64 r;
@@ -131,7 +136,7 @@
 }
 
 /* Return X << N.  */
-static inline u64
+_GL_U64_INLINE u64
 u64shl (u64 x, int n)
 {
   u64 r;
@@ -149,7 +154,7 @@
 }
 
 /* Return X >> N.  */
-static inline u64
+_GL_U64_INLINE u64
 u64shr (u64 x, int n)
 {
   u64 r;
@@ -167,3 +172,5 @@
 }
 
 #endif
+
+_GL_INLINE_HEADER_END

=== modified file 'lib/utimens.c'
--- lib/utimens.c	2012-06-22 21:26:37 +0000
+++ lib/utimens.c	2012-08-01 22:11:58 +0000
@@ -21,6 +21,7 @@
 
 #include <config.h>
 
+#define _GL_UTIMENS_INLINE _GL_EXTERN_INLINE
 #include "utimens.h"
 
 #include <assert.h>

=== modified file 'lib/utimens.h'
--- lib/utimens.h	2012-06-24 17:21:20 +0000
+++ lib/utimens.h	2012-08-01 22:11:58 +0000
@@ -1,3 +1,22 @@
+/* Set file access and modification times.
+
+   Copyright 2012 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 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 Paul Eggert.  */
+
 #include <time.h>
 int fdutimens (int, char const *, struct timespec const [2]);
 int utimens (char const *, struct timespec const [2]);
@@ -7,13 +26,21 @@
 # include <fcntl.h>
 # include <sys/stat.h>
 
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_UTIMENS_INLINE
+# define _GL_UTIMENS_INLINE _GL_INLINE
+#endif
+
 int fdutimensat (int fd, int dir, char const *name, struct timespec const [2],
                  int atflag);
 
 /* Using this function makes application code slightly more readable.  */
-static inline int
+_GL_UTIMENS_INLINE int
 lutimensat (int dir, char const *file, struct timespec const times[2])
 {
   return utimensat (dir, file, times, AT_SYMLINK_NOFOLLOW);
 }
+
+_GL_INLINE_HEADER_END
+
 #endif

=== added file 'm4/extern-inline.m4'
--- m4/extern-inline.m4	1970-01-01 00:00:00 +0000
+++ m4/extern-inline.m4	2012-08-01 22:11:58 +0000
@@ -0,0 +1,40 @@
+dnl 'extern inline' a la ISO C99.
+
+dnl Copyright 2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXTERN_INLINE],
+[
+  AC_REQUIRE([AC_C_INLINE])
+  AH_VERBATIM([extern_inline],
+[/* _GL_INLINE is a portable alternative to ISO C99 plain 'inline'.
+   _GL_EXTERN_INLINE is a portable alternative to 'extern inline'.
+   _GL_INLINE_HEADER_BEGIN contains useful stuff to put
+     in an include file, before uses of _GL_INLINE.
+     It suppresses GCC's bogus "no previous prototype for 'FOO'" diagnostic,
+     when FOO is an inline function in the header; see
+     <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113>.
+   _GL_INLINE_HEADER_END contains useful stuff to put
+     in the same include file, after uses of _GL_INLINE.  */
+#if __GNUC__ ? __GNUC_STDC_INLINE__ : 199901L <= __STDC_VERSION__
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
+#  define _GL_INLINE_HEADER_BEGIN \
+     _Pragma ("GCC diagnostic push") \
+     _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"")
+#  define _GL_INLINE_HEADER_END \
+     _Pragma ("GCC diagnostic pop")
+# endif
+#else
+# define _GL_INLINE static inline
+# define _GL_EXTERN_INLINE static inline
+#endif
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif])
+])

=== modified file 'm4/gnulib-comp.m4'
--- m4/gnulib-comp.m4	2012-07-28 23:05:32 +0000
+++ m4/gnulib-comp.m4	2012-08-01 22:11:58 +0000
@@ -55,6 +55,7 @@
   # Code from module environ:
   # Code from module extensions:
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  # Code from module extern-inline:
   # Code from module filemode:
   # Code from module getloadavg:
   # Code from module getopt-gnu:
@@ -151,6 +152,7 @@
 gl_UNISTD_MODULE_INDICATOR([dup2])
 gl_ENVIRON
 gl_UNISTD_MODULE_INDICATOR([environ])
+AC_REQUIRE([gl_EXTERN_INLINE])
 gl_FILEMODE
 gl_GETLOADAVG
 if test $HAVE_GETLOADAVG = 0; then
@@ -261,7 +263,6 @@
 fi
 gl_TIME_MODULE_INDICATOR([time_r])
 gl_TIMESPEC
-AC_REQUIRE([AC_C_INLINE])
 gl_UNISTD_H
 gl_UTIMENS
   gl_gnulib_enabled_dosname=false
@@ -565,6 +566,7 @@
   lib/sha512.c
   lib/sha512.h
   lib/signal.in.h
+  lib/stat-time.c
   lib/stat-time.h
   lib/stat.c
   lib/stdalign.in.h
@@ -590,7 +592,9 @@
   lib/time_r.c
   lib/timespec-add.c
   lib/timespec-sub.c
+  lib/timespec.c
   lib/timespec.h
+  lib/u64.c
   lib/u64.h
   lib/unistd.in.h
   lib/utimens.c
@@ -603,6 +607,7 @@
   m4/dup2.m4
   m4/environ.m4
   m4/extensions.m4
+  m4/extern-inline.m4
   m4/filemode.m4
   m4/getloadavg.m4
   m4/getopt.m4