[cfe-dev] Using clang to parse C++ on Windows
Jesper Eskilson
Jesper.Eskilson at iar.com
Tue Oct 29 07:37:02 PDT 2013
Hi,
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.
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.
> $ clang -fno-ms-extensions -D_GNU_SOURCE -c foo.cpp -isystem
> ./linux-glibc/include -isystem ./linux-glibc/include/c++/4
> .7 -isystem ./linux-glibc/include/c++/4.7/bits -isystem
> linux-glibc/include/c++/4.7/x86_64-linux-gnu
> In file included from foo.cpp:1:
> In file included from ./linux-glibc/include/c++/4.7\vector:63:
> In file included from
> ./linux-glibc/include/c++/4.7\bits/stl_construct.h:63:
> In file included from ./linux-glibc/include/c++/4.7\ext/alloc_traits.h:35:
> ./linux-glibc/include/c++/4.7\bits/alloc_traits.h:56:35: error:
> in-class initializer for static data member is not a
> constant expression
> static const bool __value = _S_chk<_Alloc, _Tp>(nullptr);
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ./linux-glibc/include/c++/4.7\bits/alloc_traits.h:63:19: note: in
> instantiation of template class
> 'std::__alloctr_rebind_helper<std::allocator<int>, int>'
> requested here
> bool = __alloctr_rebind_helper<_Alloc, _Tp>::__value>
> ^
> ./linux-glibc/include/c++/4.7\bits/alloc_traits.h:201:9: note: in
> instantiation of default argument for
> '__alloctr_rebind<std::allocator<int>, int>' required here
> using rebind_alloc = typename __alloctr_rebind<_Alloc,
> _Tp>::__type;
> ^~~~~
> ./linux-glibc/include/c++/4.7\ext/alloc_traits.h:183:47: note: in
> instantiation of template type alias 'rebind_alloc'
> requested here
> { typedef typename _Base_type::template rebind_alloc<_Tp> other; };
> ^
> ./linux-glibc/include/c++/4.7\bits/stl_vector.h:75:59: note: in
> instantiation of template class
> '__gnu_cxx::__alloc_traits<std::allocator<int> >::rebind<int>'
> requested here
> typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
> ^
> ./linux-glibc/include/c++/4.7\bits/stl_vector.h:208:30: note: in
> instantiation of template class 'std::_Vector_base<int,
>
> std::allocator<int> >' requested here
> class vector : protected _Vector_base<_Tp, _Alloc>
> ^
> foo.cpp:2:18: note: in instantiation of template class
> 'std::vector<int, std::allocator<int> >' requested here
> std::vector<int> foo;
> ^
foo.cpp is a really simple source file which looks like this:
// foo.cpp
#include <vector>
std::vector<int> foo;
// end
The "linux-glibc/include" is a pretty large directory containing the
entire /usr/include directory from my Linux machine.
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).
Are there other internal differences between Clang when run on Windows
vs. Linux which may account for this?
--
*Jesper Eskilson* /Development Engineer/
IAR Systems AB
Box 23051, Strandbodgatan 1
SE-750 23 Uppsala, SWEDEN
E-mail: jesper.eskilson at iar.com <mailto:jesper.eskilson at iar.com>
Website: www.iar.com
<http://www.iar.com> Twitter: www.twitter.com/iarsystems
<http://www.twitter.com/iarsystems>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131029/0f37e146/attachment.html>
More information about the cfe-dev
mailing list