Hello, MacPorts developers:
I am attempting to resolve a -Wimplicit-function-declaration generated
by the ./configure code[1] of a port. The relevant code appears to be
checking if the C11 feature std::at_quick_exit()[2] is defined. The
configure code expands to:
#include <stdlib.h>
static void func(void)
{}
int
main (void)
{
at_quick_exit(func);
;
return 0;
}
When I attempt to compile it with clang as provided by XCode 11.2.1
(11B5000) on macOS 10.14.6 Mojave, I get the
-Wimplicit-function-declaration warning:
% /usr/bin/clang -o conftest -std=c11 -I/opt/local/include -Werror -Wall
-Wpointer-arith -Wcast-align -Wno-tautological-compare
-L/opt/local/libexec/qt5/lib -L/opt/local/lib conftest.c -liconv
conftest.c:99:2: error: implicit declaration of function 'at_quick_exit' is
invalid in C99 [-Werror,-Wimplicit-function-declaration]
at_quick_exit(func);
^
1 error generated.
%
Most of the instructions about resolving -Wimplicit-function-declaration
warning[3] assume code which does not include the appropriate system
header, and suggest adding the system header.
But this code does have the right system header: <stdlib.h>. It looks
like that header does not include a declaration of at_quick_exit(). Thus
the call to at_quick_exit() in the main function is in fact an implicit
function declaration, and the warning is appropriate. Let's assume that
is correct; that this compiler and its includes and libraries really do
not have at_quick_exit(). Maybe some other compilers or versions do have
it. And let's assume that this configure code fails correctly, and thus
configures correctly in the absence of at_quick_exit().
Is it significant that the error message mentions "C99", when I am
passing the compiler the option "-std=c11"? Have I failed to get the
compiler into C11 support mode?
How can I patch this code so that it passes where the feature is
defined, and fails where the feature is not, and does not result in
MacPorts displaying a warning in the main.log file when building the port?
I don't see other commits which mention this feature as part of implicit
function declaration warnings[4].
[1]
<https://github.com/freeciv/freeciv/blob/15de591c1ce0e8b7abd717d034cdf4cd6326ddfa/m4/c11.m4#L32-L51>
[2] <https://en.cppreference.com/w/cpp/utility/program/at_quick_exit>
[3] see links in
<https://trac.macports.org/wiki/WimplicitFunctionDeclaration>
[4]
<https://github.com/macports/macports-ports/search?q=at_quick_exit&type=commits>
[5] Verbose compilation output:
% /usr/bin/clang -v -o conftest -std=c11 -I/opt/local/include -Werror -Wall
-Wpointer-arith -Wcast-align -Wno-tautological-compare
-L/opt/local/libexec/qt5/lib -L/opt/local/lib conftest.c -liconv
Apple clang version 11.0.0 (clang-1100.0.33.12)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang"
-cc1 -triple x86_64-apple-macosx10.14.0 -Wdeprecated-objc-isa-usage
-Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free
-disable-llvm-verifier -discard-value-names -main-file-name conftest.c -mrelocation-model
pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose
-munwind-tables -target-sdk-version=10.14 -target-cpu penryn -dwarf-column-info
-debugger-tuning=lldb -ggnu-pubnames -target-linker-version 520 -v -resource-dir
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0
-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I /opt/local/include
-I/usr/local/include -Werror -Wall -Wpointer-arith -Wcast-align -Wno-tautological-compare
-Wno-framework-include-private-from-public -Wno-atimport-in-framework-header
-Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -std=c11
-fdebug-compilation-dir /Users/jdlh/workspace/freeciv_overall/freeciv_S2_6 -ferror-limit
19 -fmessage-length 132 -stack-protector 1 -mdarwin-stkchk-strong-link -fblocks
-fencode-extended-block-signature -fregister-global-dtors-with-atexit
-fobjc-runtime=macosx-10.14.0 -fmax-type-align=16 -fdiagnostics-show-option
-fcolor-diagnostics -o /var/folders/5p/zmlrjq6c8xj84s0059bnypz80000gp/T/conftest-c6e47f.o
-x c conftest.c
clang -cc1 version 11.0.0 (clang-1100.0.33.12) default target
x86_64-apple-darwin18.7.0
ignoring nonexistent directory
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
/opt/local/include
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks
(framework directory)
End of search list.
conftest.c:99:2: error: implicit declaration of function 'at_quick_exit' is
invalid in C99 [-Werror,-Wimplicit-function-declaration]
at_quick_exit(func);
^
1 error generated.
Best regards,
—Jim DeLaHunt, Vancouver, Canada