Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clang can't compile programs using the <functional> header anymore

Tags:

c++

c++17

stl

clang

I'm using clang Version 4.0.0 on my system running ArchLinux, it always worked fine, but recently I can't compile programs that use certain STL headers anymore!

Details:

Output of clang --version:

 clang version 4.0.0 (tags/RELEASE_400/final)
 Target: x86_64-unknown-linux-gnu
 Thread model: posix
 InstalledDir: /usr/bin

Output of gcc --version:

 gcc (GCC) 7.1.1 20170528

Example:

I tried compiling the following trivial program:

#include <functional>

int main()
{
    return 0;
}

I am using the following command:

clang++ -std=c++1z test.cxx

And the result is failure:

In file included from test.cxx:3:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/functional:60:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/unordered_map:47:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/hashtable.h:37:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/node_handle.h:39:
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:27: error: use of
      class template 'optional' requires template arguments
  template <typename _Tp> optional(_Tp) -> optional<_Tp>;
                          ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:451:11: note: template
      is declared here
    class optional
          ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:40: error: 
      expected ';' at end of declaration
  template <typename _Tp> optional(_Tp) -> optional<_Tp>;
                                       ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:41: error: cannot
      use arrow operator on a type
  template <typename _Tp> optional(_Tp) -> optional<_Tp>;
                                        ^
3 errors generated.

Is this a bug in the STL or is my setup messed up?

like image 512
nshct Avatar asked Jun 16 '17 08:06

nshct


1 Answers

Your setup is messed up. Funny enough, I have the exact same problem.

When you upgraded to gcc 7.1.1, libstdc++ (which is gcc's Standard Library) was updated alongside of it to provide the new features from C++17. Using gcc, this works, because it has almost full C++17 support.

But clang doesn't. A hint is the -std=c++1z flag instead of gcc's -std=c++17 flag. Clang is missing deduction guides, and when it encounters them in libstdc++, it doesn't know what to do with them.

You can install the old libstdc++ package from the ALA, or you can download/use LLVM's Standard Library libc++, which naturally has only partial C++17 features.

like image 62
Rakete1111 Avatar answered Oct 27 '22 08:10

Rakete1111