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.
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.
## ------------------------------- ##
+# _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;
])],
[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
# 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)]],,,
#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
])])