summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoah Misch <noah@cs.caltech.edu>2015-05-13 21:11:47 -0400
committerNoah Misch <noah@cs.caltech.edu>2015-05-13 21:11:47 -0400
commit82ef7805faffa151e724aa76c245ec590d174580 (patch)
tree9b1b38555e5517f3d29a75a5e97eec43fbbc0c5b
parentd2f0ec870814233f21d9f3404ef60b8c65b47cad (diff)
downloadautoconf-82ef7805faffa151e724aa76c245ec590d174580.tar.gz
AC_CHECK_DECL, AC_CHECK_DECLS: port to the Clang compiler
* lib/autoconf/general.m4 (_AC_UNDECLARED_WARNING): New macro. (_AC_CHECK_DECL_BODY): Call it once per language; treat warnings as errors when its verdict indicates that. * tests/semantics.at (AC_CHECK_DECLS): Add a macro call that relies on the new semantics. Avoid -Wmissing-variable-declarations warnings. * doc/autoconf.texi (Generic Declarations): Document the implications. * NEWS: Mention this change.
-rw-r--r--NEWS3
-rw-r--r--doc/autoconf.texi12
-rw-r--r--lib/autoconf/general.m460
-rw-r--r--tests/semantics.at10
4 files changed, 81 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 2df5a80..f691179 100644
--- a/NEWS
+++ b/NEWS
@@ -61,6 +61,9 @@ GNU Autoconf NEWS - User visible changes.
- AC_USE_SYSTEM_EXTENSIONS now enables more system extensions on HP-UX,
MINIX 3, and OS X.
+- AC_CHECK_DECL and AC_CHECK_DECLS can now report missing declarations for
+ functions that are also Clang compiler builtins.
+
- AC_FUNC_VFORK now checks for the signal-handling bug in Solaris 2.4 'vfork'.
Formerly, it ignored this bug, so that Emacs could use some tricky
code on that platform. Solaris 2.4 has not been supported since
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index b2ca0ae..8c4302d 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -6315,6 +6315,12 @@ parentheses for types which can be zero-initialized:
AC_CHECK_DECL([basename(char *)])
@end example
+Some compilers don't indicate every missing declaration by the error
+status. This macro checks the standard error from such compilers and
+considers a declaration missing if any warnings have been reported. For
+most compilers, though, warnings do not affect this macro's outcome
+unless @code{AC_LANG_WERROR} is also specified.
+
This macro caches its result in the @code{ac_cv_have_decl_@var{symbol}}
variable, with characters not suitable for a variable name mapped to
underscores.
@@ -6375,6 +6381,12 @@ You fall into the second category only in extreme situations: either
your files may be used without being configured, or they are used during
the configuration. In most cases the traditional approach is enough.
+Some compilers don't indicate every missing declaration by the error
+status. This macro checks the standard error from such compilers and
+considers a declaration missing if any warnings have been reported. For
+most compilers, though, warnings do not affect this macro's outcome
+unless @code{AC_LANG_WERROR} is also specified.
+
This macro caches its results in @code{ac_cv_have_decl_@var{symbol}}
variables, with characters not suitable for a variable name mapped to
underscores.
diff --git a/lib/autoconf/general.m4 b/lib/autoconf/general.m4
index 49df536..a7f1439 100644
--- a/lib/autoconf/general.m4
+++ b/lib/autoconf/general.m4
@@ -2864,15 +2864,72 @@ AC_DEFUN([AC_CHECK_FILES],
## ------------------------------- ##
+# _AC_UNDECLARED_WARNING
+# ----------------------
+# Set ac_[]_AC_LANG_ABBREV[]_decl_warn_flag=yes if the compiler uses a warning,
+# not a more-customary error, to report some undeclared identifiers. Fail when
+# an affected compiler warns also on valid input. _AC_PROG_PREPROC_WORKS_IFELSE
+# solves a related problem.
+AC_DEFUN([_AC_UNDECLARED_WARNING],
+[# The Clang compiler raises a warning for an undeclared identifier that matches
+# a compiler builtin function. All extant Clang versions are affected, as of
+# Clang 3.6.0. Test a builtin known to every version. This problem affects the
+# C and Objective C languages, but Clang does report an error under C++ and
+# Objective C++.
+#
+# Passing -fno-builtin to the compiler would suppress this problem. That
+# strategy would have the advantage of being insensitive to stray warnings, but
+# it would make tests less realistic.
+AC_CACHE_CHECK([how $[]_AC_CC[] reports undeclared, standard C functions],
+[ac_cv_[]_AC_LANG_ABBREV[]_decl_report],
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [(void) strchr;])],
+ [AS_IF([test -s conftest.err], [dnl
+ # For AC_CHECK_DECL to react to warnings, the compiler must be silent on
+ # valid AC_CHECK_DECL input. No library function is consistently available
+ # on freestanding implementations, so test against a dummy declaration.
+ # Include always-available headers on the off chance that they somehow
+ # elicit warnings.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([dnl
+#include <float.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stddef.h>
+extern void ac_decl (int, char *);],
+[@%:@ifdef __cplusplus
+ (void) ac_decl ((int) 0, (char *) 0);
+ (void) ac_decl;
+@%:@else
+ (void) ac_decl;
+@%:@endif
+])],
+ [AS_IF([test -s conftest.err],
+ [AC_MSG_FAILURE([cannot detect from compiler exit status or warnings])],
+ [ac_cv_[]_AC_LANG_ABBREV[]_decl_report=warning])],
+ [AC_MSG_FAILURE([cannot compile a simple declaration test])])],
+ [AC_MSG_FAILURE([compiler does not report undeclared identifiers])])],
+ [ac_cv_[]_AC_LANG_ABBREV[]_decl_report=error])])
+
+case $ac_cv_[]_AC_LANG_ABBREV[]_decl_report in
+ warning) ac_[]_AC_LANG_ABBREV[]_decl_warn_flag=yes ;;
+ *) ac_[]_AC_LANG_ABBREV[]_decl_warn_flag= ;;
+esac
+])# _AC_UNDECLARED_WARNING
+
# _AC_CHECK_DECL_BODY
# -------------------
# Shell function body for AC_CHECK_DECL.
m4_define([_AC_CHECK_DECL_BODY],
[ AS_LINENO_PUSH([$[]1])
+ # Initialize each $ac_[]_AC_LANG_ABBREV[]_decl_warn_flag once.
+ AC_DEFUN([_AC_UNDECLARED_WARNING_]_AC_LANG_ABBREV,
+ [_AC_UNDECLARED_WARNING])dnl
+ AC_REQUIRE([_AC_UNDECLARED_WARNING_]_AC_LANG_ABBREV)dnl
[as_decl_name=`echo $][2|sed 's/ *(.*//'`]
[as_decl_use=`echo $][2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`]
AC_CACHE_CHECK([whether $as_decl_name is declared], [$[]3],
- [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$[]4],
+ [ac_save_werror_flag=$ac_[]_AC_LANG_ABBREV[]_werror_flag
+ ac_[]_AC_LANG_ABBREV[]_werror_flag="$ac_[]_AC_LANG_ABBREV[]_decl_warn_flag$ac_[]_AC_LANG_ABBREV[]_werror_flag"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$[]4],
[@%:@ifndef $[]as_decl_name
@%:@ifdef __cplusplus
(void) $[]as_decl_use;
@@ -2883,6 +2940,7 @@ m4_define([_AC_CHECK_DECL_BODY],
])],
[AS_VAR_SET([$[]3], [yes])],
[AS_VAR_SET([$[]3], [no])])])
+ ac_[]_AC_LANG_ABBREV[]_werror_flag=$ac_save_werror_flag
AS_LINENO_POP
])# _AC_CHECK_DECL_BODY
diff --git a/tests/semantics.at b/tests/semantics.at
index a7abd52..1294545 100644
--- a/tests/semantics.at
+++ b/tests/semantics.at
@@ -101,15 +101,18 @@ esac
# AC_CHECK_DECLS
# --------------
-# Check that it performs the correct actions:
+# For the benefit of _AC_UNDECLARED_WARNING compilers, these INCLUDES sections
+# should not elicit warnings.
AT_CHECK_MACRO([AC_CHECK_DECLS],
[[AC_CHECK_DECLS([yes, no, myenum, mystruct, myfunc, mymacro1, mymacro2],,,
- [[int yes = 1;
+ [[extern int yes;
enum { myenum };
- struct { int x[20]; } mystruct;
+ extern struct { int x[20]; } mystruct;
extern int myfunc();
#define mymacro1(arg) arg
#define mymacro2]])
+ # Clang reports a warning for an undeclared builtin.
+ AC_CHECK_DECLS([strerror],,, [[]])
# The difference in space-before-open-paren is intentional.
AC_CHECK_DECLS([basenam (char *), dirnam(char *),
[moreargs (char, short, int, long, void *, char [], float, double)]],,,
@@ -148,6 +151,7 @@ AT_CHECK_MACRO([AC_CHECK_DECLS],
#define HAVE_DECL_MYMACRO2 1
#define HAVE_DECL_MYSTRUCT 1
#define HAVE_DECL_NO 0
+#define HAVE_DECL_STRERROR 0
#define HAVE_DECL_YES 1
])])