<html>
<head>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-1">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<br>
Hi,<br>
<br>
I've gotten stuck on a weird error message from Clang. I'm writing a
Clang-based tool to analyze legacy C++ source code. The code relies
heavily on Windows-specific headers files (MFC, etc) and I have
never been able to get Clang to properly parse MS own header files.
Running the tool on Linux works fine; I've created a set of dummy
replacement header files which are complete enough to allow Clang to
build a usable AST for me. However, running the tool on Windows
turns out to be more difficult than I thought.<br>
<br>
I've tried several approaches as to what header files should be
used. Clang was never able to get through the MS header files
without crashing or producing various errors. Since the tool worked
fine on Linux, I imagined that it should be possible to use Linux
header files instead. This got me pretty far, but now I've gotten
stuck on an error which I cannot make sense of.<br>
<br>
<blockquote type="cite">$ clang -fno-ms-extensions -D_GNU_SOURCE -c
foo.cpp -isystem ./linux-glibc/include -isystem
./linux-glibc/include/c++/4<br>
.7 -isystem ./linux-glibc/include/c++/4.7/bits -isystem
linux-glibc/include/c++/4.7/x86_64-linux-gnu<br>
In file included from foo.cpp:1:<br>
In file included from ./linux-glibc/include/c++/4.7\vector:63:<br>
In file included from
./linux-glibc/include/c++/4.7\bits/stl_construct.h:63:<br>
In file included from
./linux-glibc/include/c++/4.7\ext/alloc_traits.h:35:<br>
./linux-glibc/include/c++/4.7\bits/alloc_traits.h:56:35: error:
in-class initializer for static data member is not a<br>
constant expression<br>
static const bool __value = _S_chk<_Alloc,
_Tp>(nullptr);<br>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
./linux-glibc/include/c++/4.7\bits/alloc_traits.h:63:19: note: in
instantiation of template class<br>
'std::__alloctr_rebind_helper<std::allocator<int>,
int>' requested here<br>
bool = __alloctr_rebind_helper<_Alloc,
_Tp>::__value><br>
^<br>
./linux-glibc/include/c++/4.7\bits/alloc_traits.h:201:9: note: in
instantiation of default argument for<br>
'__alloctr_rebind<std::allocator<int>, int>'
required here<br>
using rebind_alloc = typename __alloctr_rebind<_Alloc,
_Tp>::__type;<br>
^~~~~<br>
./linux-glibc/include/c++/4.7\ext/alloc_traits.h:183:47: note: in
instantiation of template type alias 'rebind_alloc'<br>
requested here<br>
{ typedef typename _Base_type::template
rebind_alloc<_Tp> other; };<br>
^<br>
./linux-glibc/include/c++/4.7\bits/stl_vector.h:75:59: note: in
instantiation of template class<br>
'__gnu_cxx::__alloc_traits<std::allocator<int>
>::rebind<int>' requested here<br>
typedef typename
__gnu_cxx::__alloc_traits<_Alloc>::template<br>
^<br>
./linux-glibc/include/c++/4.7\bits/stl_vector.h:208:30: note: in
instantiation of template class 'std::_Vector_base<int,<br>
<br>
std::allocator<int> >' requested here<br>
class vector : protected _Vector_base<_Tp, _Alloc><br>
^<br>
foo.cpp:2:18: note: in instantiation of template class
'std::vector<int, std::allocator<int> >' requested
here<br>
std::vector<int> foo;<br>
^</blockquote>
<br>
foo.cpp is a really simple source file which looks like this:<br>
<br>
// foo.cpp<br>
#include <vector><br>
std::vector<int> foo;<br>
// end<br>
<br>
The "linux-glibc/include" is a pretty large directory containing the
entire /usr/include directory from my Linux machine.<br>
<br>
Compiling the same program on Linux works fine. I've compared the
include file order, preprocessor symbols, and the list of options
being passed to the compiler driver ('clang -v ... foo.cpp'), and I
cannot find anything significant which is different. (Some things
are naturally different; for example Clang on Windows is compiling
32-bit binaries, while my Linux-Clang is building 64-bit ones).<br>
<br>
Are there other internal differences between Clang when run on
Windows vs. Linux which may account for this?<br>
<br>
<div class="moz-signature">-- <br>
<span style="color: #a6a6a6; font-family:
arial,helvetica,sans-serif; font-size: 10pt;"><strong>Jesper
Eskilson</strong></span> <span style="color: #fdb913;
font-family: arial,helvetica,sans-serif; font-size: 10pt;"><em>Development
Engineer</em></span><br>
<span style="color: #808080; font-family:
arial,helvetica,sans-serif; font-size: 10pt;">IAR Systems AB<br>
Box 23051, Strandbodgatan 1<br>
SE-750 23 Uppsala, SWEDEN<br>
E-mail: <a href="mailto:jesper.eskilson@iar.com"> <span
style="color: #808080; font-family:
arial,helvetica,sans-serif; font-size: 10pt;">jesper.eskilson@iar.com</span></a>
Website: <a href="http://www.iar.com"> <span style="color:
#808080; font-family: arial,helvetica,sans-serif; font-size:
10pt;">www.iar.com<br>
</span></a> Twitter: <a
href="http://www.twitter.com/iarsystems"> <span style="color:
#808080; font-family: arial,helvetica,sans-serif; font-size:
10pt;">www.twitter.com/iarsystems</span></a> </span> </div>
</body>
</html>