<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>