[cfe-dev] C++ language linkage problem
Dmitri Shubin
sbn at tbricks.com
Sun Jul 14 06:43:15 PDT 2013
Hi list!
In C++ standard (C++11) I can read the following about bsearch() library
function (25.5.3 [alg.c.library]):
The function signature:
bsearch(const void *, const void *, size_t, size_t,
int (*)(const void *, const void *));
is replaced by the two declarations:
extern "C" void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
extern "C++" void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
But clang (3.4 from trunk) rejects to compile these 2 declarations:
$ cat a.cpp
typedef unsigned long size_t;
extern "C" void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
extern "C++" void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
$ ../build-clang-cmake/bin/clang++ -v -std=c++11 -c a.cpp
clang version 3.4
Target: i386-pc-solaris2.10
Thread model: posix
"/export/home/sbn/src/build-clang-cmake/bin/clang-3.4" -cc1 -triple
i386-pc-solaris2.10 -emit-obj -mrelax-all -disable-free
-disable-llvm-verifier -main-file-name a.cpp -mrelocation-model static
-mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases
-target-cpu pentium4 -v -coverage-file
/export/home/sbn/src/extern-cpp/a.o -resource-dir
/export/home/sbn/src/build-clang-cmake/bin/../lib/clang/3.4 -std=c++11
-fdeprecated-macro -fdebug-compilation-dir
/export/home/sbn/src/extern-cpp -ferror-limit 19 -fmessage-length 237
-mstackrealign -fobjc-runtime=gcc -fobjc-default-synthesize-properties
-fcxx-exceptions -fexceptions -fdiagnostics-show-option
-fcolor-diagnostics -vectorize-loops -o a.o -x c++ a.cpp
clang -cc1 version 3.4 based upon LLVM 3.4svn default target
i386-pc-solaris2.10
#include "..." search starts here:
#include <...> search starts here:
/opt/csw/include/c++/4.8.0
/opt/csw/include/c++/4.8.0/i386-pc-solaris2.10
/opt/csw/include/c++/4.8.0/backward
/export/home/sbn/src/build-clang-cmake/bin/../lib/clang/3.4/include
/usr/include
End of search list.
a.cpp:7:20: error: declaration of 'bsearch' has a different language linkage
extern "C++" void *bsearch(const void *key, const void *base,
^
a.cpp:3:18: note: previous declaration is here
extern "C" void *bsearch(const void *key, const void *base,
^
1 error generated.
BTW this file is perfectly compile-able using clang 3.2:
$ /tb/soft/sun/x86_64/clang/bin/clang++ -v -std=c++11 -c a.cpp
clang version 3.2 (branches/release_32 174327)
Target: i386-pc-solaris2.10
Thread model: posix
"/tb/soft/sun/i386/clang/bin/clang-3.2" -cc1 -triple
i386-pc-solaris2.10 -emit-obj -mrelax-all -disable-free
-disable-llvm-verifier -main-file-name a.cpp -mrelocation-model static
-mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases
-target-cpu pentium4 -momit-leaf-frame-pointer -v -coverage-file
/export/home/sbn/src/extern-cpp/a.o -resource-dir
/tb/soft/sun/i386/clang/bin/../lib/clang/3.2 -fmodule-cache-path
/var/tmp/clang-module-cache -std=c++11 -fdeprecated-macro
-fdebug-compilation-dir /export/home/sbn/src/extern-cpp -ferror-limit 19
-fmessage-length 237 -mstackrealign -fobjc-runtime=gcc -fcxx-exceptions
-fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o a.o -x c++
a.cpp
clang -cc1 version 3.2 based upon LLVM 3.2svn default target
i386-pc-solaris2.10
ignoring nonexistent directory "/opt/csw/include/c++/4.7.2"
ignoring nonexistent directory
"/opt/csw/include/c++/4.7.2/i386-pc-solaris2.10/"
ignoring nonexistent directory "/opt/csw/include/c++/4.7.2/backward"
ignoring nonexistent directory
"/tb/soft/sun/i386/clang/bin/../lib/clang/3.2/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include
End of search list.
Is it some known bug/regression/fix or should I file a case?
Thanks!
More information about the cfe-dev
mailing list