<div dir="ltr">On Tue, Oct 29, 2013 at 7:37 AM, Jesper Eskilson <span dir="ltr"><<a href="mailto:Jesper.Eskilson@iar.com" target="_blank">Jesper.Eskilson@iar.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div 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></blockquote></div></blockquote><div><br></div><div>At a guess, clang is implicitly running in -fdelayed-template-parsing mode, and this is failing because _S_chk<...> is a constexpr function template specialization that has not been parsed yet. That's a bug that was fixed recently.</div>
<div><br></div><div>What target triple is clang using? IIRC we only turn on -fdelayed-template-parsing in MSVC-compatibility mode, but it looks like you're going for something more like a mingw target. (libstdc++ probably won't work in MSVC-compatibility mode.)</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF"><blockquote type="cite">
./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?<span class="HOEnZb"><font color="#888888"><br>
<br>
<div>-- <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" target="_blank"> <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" target="_blank"> <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" target="_blank"> <span style="color:#808080;font-family:arial,helvetica,sans-serif;font-size:10pt">www.twitter.com/iarsystems</span></a> </span> </div>
</font></span></div>
<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div></div>