]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
AC_CHECK_DECL, AC_CHECK_DECLS: port to the Clang compiler
authorNoah Misch <noah@cs.caltech.edu>
Thu, 14 May 2015 01:11:47 +0000 (21:11 -0400)
committerNoah Misch <noah@cs.caltech.edu>
Thu, 14 May 2015 01:11:47 +0000 (21:11 -0400)
* 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.

NEWS
doc/autoconf.texi
lib/autoconf/general.m4
tests/semantics.at

diff --git a/NEWS b/NEWS
index 2df5a809f8ff8f2dea993a1ddd98b8c706465fa2..f691179bf94762fd055b9daa5c26caf6a07a530b 100644 (file)
--- 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
index b2ca0ae5019945caa10d98a07f234ed340695431..8c4302d335bdf53d0f085ae7b3a2781b7fdc2a96 100644 (file)
@@ -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.
index 49df5367ba04dca84c92169a95701638a3fdc36b..a7f143960de44182a0139f9ab302fd652aaebc32 100644 (file)
@@ -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
 
index a7abd52632436018a4368dd671792fd6fbe99f5d..12945451afd2ec6a83d19a7daa258f42991ed46a 100644 (file)
@@ -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
 ])])