/* conf_post.h --- configure.ac includes this via AH_BOTTOM
-Copyright (C) 1988, 1993-1994, 1999-2002, 2004-2015 Free Software
+Copyright (C) 1988, 1993-1994, 1999-2002, 2004-2016 Free Software
Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs 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.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
#include <stdbool.h>
+/* GNUC_PREREQ (V, W, X) is true if this is GNU C version V.W.X or later.
+ It can be used in a preprocessor expression. */
+#ifndef __GNUC_MINOR__
+# define GNUC_PREREQ(v, w, x) false
+#elif ! defined __GNUC_PATCHLEVEL__
+# define GNUC_PREREQ(v, w, x) \
+ ((v) < __GNUC__ + ((w) < __GNUC_MINOR__ + ((x) == 0))
+#else
+# define GNUC_PREREQ(v, w, x) \
+ ((v) < __GNUC__ + ((w) < __GNUC_MINOR__ + ((x) <= __GNUC_PATCHLEVEL__)))
+#endif
+
/* The type of bool bitfields. Needed to compile Objective-C with
standard GCC. It was also needed to port to pre-C99 compilers,
although we don't care about that any more. */
#endif
#endif
-/* When not using Clang, assume its attributes and features are absent. */
+/* Simulate __has_attribute on compilers that lack it. It is used only
+ on arguments like alloc_size that are handled in this simulation. */
#ifndef __has_attribute
-# define __has_attribute(a) false
+# define __has_attribute(a) __has_attribute_##a
+# define __has_attribute_alloc_size GNUC_PREREQ (4, 3, 0)
+# define __has_attribute_cleanup GNUC_PREREQ (3, 4, 0)
+# define __has_attribute_externally_visible GNUC_PREREQ (4, 1, 0)
+# define __has_attribute_no_address_safety_analysis false
+# define __has_attribute_no_sanitize_address GNUC_PREREQ (4, 8, 0)
#endif
+
+/* Simulate __has_builtin on compilers that lack it. It is used only
+ on arguments like __builtin_assume_aligned that are handled in this
+ simulation. */
+#ifndef __has_builtin
+# define __has_builtin(a) __has_builtin_##a
+# define __has_builtin___builtin_assume_aligned GNUC_PREREQ (4, 7, 0)
+#endif
+
+/* Simulate __has_feature on compilers that lack it. It is used only
+ to define ADDRESS_SANITIZER below. */
#ifndef __has_feature
# define __has_feature(a) false
#endif
# define ADDRESS_SANITIZER false
#endif
+/* Yield PTR, which must be aligned to ALIGNMENT. */
+#if ! __has_builtin (__builtin_assume_aligned)
+# define __builtin_assume_aligned(ptr, ...) ((void *) (ptr))
+#endif
+
#ifdef DARWIN_OS
#ifdef emacs
#define malloc unexec_malloc
#ifdef emacs
#define malloc hybrid_malloc
#define realloc hybrid_realloc
+#define aligned_alloc hybrid_aligned_alloc
#define calloc hybrid_calloc
#define free hybrid_free
-#if defined HAVE_GET_CURRENT_DIR_NAME && !defined BROKEN_GET_CURRENT_DIR_NAME
-#define HYBRID_GET_CURRENT_DIR_NAME 1
-#define get_current_dir_name hybrid_get_current_dir_name
-#endif
#endif
#endif /* HYBRID_MALLOC */
#undef HAVE_RINT
#endif /* HPUX */
-#ifdef IRIX6_5
-#ifdef emacs
-char *_getpty();
-#endif
-#define INET6 /* Needed for struct sockaddr_in6. */
-#undef HAVE_GETADDRINFO /* IRIX has getaddrinfo but not struct addrinfo. */
-#endif /* IRIX6_5 */
-
#ifdef MSDOS
#ifndef __DJGPP__
You lose; /* Emacs for DOS must be compiled with DJGPP */
# define HAVE_LSTAT 1
#else
# define lstat stat
+/* DJGPP 2.03 and older don't have the next two. */
+# define EOVERFLOW ERANGE
+# define SIZE_MAX 4294967295U
#endif
/* We must intercept 'opendir' calls to stash away the directory name,
#endif
#ifdef CYGWIN
-#define SYSTEM_PURESIZE_EXTRA 10000
+#define SYSTEM_PURESIZE_EXTRA 50000
#endif
#if defined HAVE_NTGUI && !defined DebPrint
extern void _DebPrint (const char *fmt, ...);
# define DebPrint(stuff) _DebPrint stuff
# else
-# define DebPrint(stuff)
+# define DebPrint(stuff) ((void) 0)
# endif
#endif
#define RE_TRANSLATE_P(TBL) (!EQ (TBL, make_number (0)))
#endif
+/* Tell time_rz.c to use Emacs's getter and setter for TZ.
+ Only Emacs uses time_rz so this is OK. */
+#define getenv_TZ emacs_getenv_TZ
+#define setenv_TZ emacs_setenv_TZ
+extern char *emacs_getenv_TZ (void);
+extern int emacs_setenv_TZ (char const *);
+
#include <string.h>
#include <stdlib.h>
#define NO_INLINE
#endif
-#if (__clang__ \
- ? __has_attribute (externally_visible) \
- : (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)))
+#if __has_attribute (externally_visible)
#define EXTERNALLY_VISIBLE __attribute__((externally_visible))
#else
#define EXTERNALLY_VISIBLE
#endif
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+#if GNUC_PREREQ (2, 7, 0)
# define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
#else
# define ATTRIBUTE_FORMAT(spec) /* empty */
#endif
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
- ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
+#if GNUC_PREREQ (4, 4, 0) && defined __GLIBC_MINOR__
+# define PRINTF_ARCHETYPE __gnu_printf__
+#elif GNUC_PREREQ (4, 4, 0) && defined __MINGW32__
+# define PRINTF_ARCHETYPE __ms_printf__
#else
-# define ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
- ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
+# define PRINTF_ARCHETYPE __printf__
#endif
+#define ATTRIBUTE_FORMAT_PRINTF(string_index, first_to_check) \
+ ATTRIBUTE_FORMAT ((PRINTF_ARCHETYPE, string_index, first_to_check))
#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
+#define ATTRIBUTE_UNUSED _GL_UNUSED
#if 3 <= __GNUC__
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
# define ATTRIBUTE_MALLOC
#endif
-#if (__clang__ \
- ? __has_attribute (alloc_size) \
- : 4 < __GNUC__ + (3 <= __GNUC_MINOR__))
+#if __has_attribute (alloc_size)
# define ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
#else
# define ATTRIBUTE_ALLOC_SIZE(args)
no_sanitize_address attribute. This bug is fixed in GCC 4.9.0 and
clang 3.4. */
#if (! ADDRESS_SANITIZER \
- || ((4 < __GNUC__ + (9 <= __GNUC_MINOR__)) \
+ || (GNUC_PREREQ (4, 9, 0) \
|| 3 < __clang_major__ + (4 <= __clang_minor__)))
# define ADDRESS_SANITIZER_WORKAROUND /* No workaround needed. */
#else
/* Attribute of functions whose code should not have addresses
sanitized. */
-#if (__has_attribute (no_sanitize_address) \
- || 4 < __GNUC__ + (8 <= __GNUC_MINOR__))
+#if __has_attribute (no_sanitize_address)
# define ATTRIBUTE_NO_SANITIZE_ADDRESS \
__attribute__ ((no_sanitize_address)) ADDRESS_SANITIZER_WORKAROUND
#elif __has_attribute (no_address_safety_analysis)
before including config.h or any other .h file.
Other .c files should not define INLINE.
+ For Emacs, this is done by having emacs.c first '#define INLINE
+ EXTERN_INLINE' and then include every .h file that uses INLINE.
+
+ The INLINE_HEADER_BEGIN and INLINE_HEADER_END suppress bogus
+ warnings in some GCC versions; see ../m4/extern-inline.m4.
C99 compilers compile functions like 'incr' as C99-style extern
inline functions. Buggy GCC implementations do something similar with
# define FLEXIBLE_ARRAY_MEMBER
#endif
-/* Use this to suppress gcc's `...may be used before initialized' warnings. */
-#ifdef lint
-/* Use CODE only if lint checking is in effect. */
-# define IF_LINT(Code) Code
+/* 'int x UNINIT;' is equivalent to 'int x;', except it cajoles GCC
+ into not warning incorrectly about use of an uninitialized variable. */
+#if defined GCC_LINT || defined lint
+# define UNINIT = {0,}
#else
-# define IF_LINT(Code) /* empty */
+# define UNINIT /* empty */
#endif
/* conf_post.h ends here */