From: Noah Misch Date: Thu, 14 May 2015 01:11:47 +0000 (-0400) Subject: AC_CHECK_DECL, AC_CHECK_DECLS: port to the Clang compiler X-Git-Tag: v2.69b~91 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=82ef7805faffa151e724aa76c245ec590d174580;p=thirdparty%2Fautoconf.git 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. --- diff --git a/NEWS b/NEWS index 2df5a809..f691179b 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 b2ca0ae5..8c4302d3 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 49df5367..a7f14396 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 +#include +#include +#include +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 a7abd526..12945451 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 ])])