GNU bug report logs - #12116
merge from gnulib for extern-inline

Previous Next

Package: emacs;

Reported by: Paul Eggert <eggert <at> cs.ucla.edu>

Date: Wed, 1 Aug 2012 22:27:01 UTC

Severity: normal

Tags: patch

Done: Paul Eggert <paul.eggert <at> verizon.net>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Paul Eggert <paul.eggert <at> verizon.net>
Cc: tracker <at> debbugs.gnu.org
Subject: bug#12116: closed (merge from gnulib for extern-inline)
Date: Thu, 02 Aug 2012 06:26:02 +0000
[Message part 1 (text/plain, inline)]
Your message dated Wed, 01 Aug 2012 23:17:21 -0700
with message-id <501A1B71.4060409 <at> verizon.net>
and subject line Re:  merge from gnulib for extern-inline
has caused the debbugs.gnu.org bug report #12116,
regarding merge from gnulib for extern-inline
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)


-- 
12116: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=12116
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Paul Eggert <eggert <at> cs.ucla.edu>
To: bug-gnu-emacs <at> gnu.org
Cc: Juanma Barranquero <lekktu <at> gmail.com>, Eli Zaretskii <eliz <at> gnu.org>
Subject: merge from gnulib for extern-inline
Date: Wed, 01 Aug 2012 15:18:51 -0700
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  <eggert <at> cs.ucla.edu>
+
+	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  <rgm <at> gnu.org>
 
 	* 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


[Message part 3 (message/rfc822, inline)]
From: Paul Eggert <paul.eggert <at> verizon.net>
To: 12116-done <at> debbugs.gnu.org
Subject: Re:  merge from gnulib for extern-inline
Date: Wed, 01 Aug 2012 23:17:21 -0700
I installed this as trunk bzr 109387
and so am marking it as done.


This bug report was last modified 13 years and 12 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.