The Clang compiler furnishes implicit declarations for built-in functions,
even when the identifier in question is not used as a function designator.
This thwarts AC_CHECK_DECLS:
configure:11565: checking whether strlcpy is declared
configure:11565: clang -c -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv -g -O2 -D_GNU_SOURCE
-I/usr/include/libxml2 conftest.c >&5
conftest.c:166:10: warning: implicitly declaring library function 'strlcpy'
with type 'unsigned long (char *, const char *, unsigned long)'
(void) strlcpy;
^
conftest.c:166:10: note: please include the header <string.h> or explicitly
provide a declaration for 'strlcpy'
1 warning generated.
configure:11565: $? = 0
configure:11565: result: yes
Full config.log:
http://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=treepie&dt=2015-03-07%2006%3A22%3A38&stg=config
Clang has always behaved this way, but strlcpy() and strlcat() were unaffected
until Clang 3.0 added them as builtins. To fix this, I plan to introduce
ac_c_decl_warn_flag by analogy to ac_c_preproc_warn_flag. With no explicit
declarations, a typical compiler (ac_c_decl_warn_flag='') reports an error for
"(void) strchr;". Clang (ac_c_decl_warn_flag=yes) reports a warning, but
adding a declaration silences the warning. A compiler that emits some warning
with or without a declaration is unusable. Is that a reasonable plan?
Thanks,
nm