c++llvmheader-filesc++20gcc11

Error using llvm-11 in combination with standard library headers from gcc-11 compiling with -std=c++2a


I am trying to use clang together with gcc standard library headers as follows:

/opt/rh/llvm-toolset-11.0/root/usr/bin/clang -MD -MF bazel-out/k8-fastbuild/bin/external/com_google_googletest/_objs/gtest/gtest-typed-test.d '-frandom-seed=bazel-out/k8-fastbuild/bin/external/com_google_googletest/_objs/gtest/gtest-typed-test.o' -iquote external/com_google_googletest -iquote bazel-out/k8-fastbuild/bin/external/com_google_googletest -isystem external/com_google_googletest/googlemock -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googlemock -isystem external/com_google_googletest/googlemock/include -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googlemock/include -isystem external/com_google_googletest/googletest -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googletest -isystem external/com_google_googletest/googletest/include -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googletest/include -isystem /opt/rh/devtoolset-11/root/usr/include/c++/11 -isystem /opt/rh/devtoolset-11/root/usr/include/c++/11/bits -isystem /opt/rh/devtoolset-11/root/include/c++/11/x86_64-redhat-linux/bits -fdiagnostics-color -Wfatal-errors '-std=c++2a' -Wall -Wno-sign-compare '--gcc-toolchain=/opt/rh/devtoolset-11/root' -Wheader-guard -pthread -c external/com_google_googletest/googletest/src/gtest-typed-test.cc -o bazel-out/k8-fastbuild/bin/external/com_google_googletest/_objs/gtest/gtest-typed-test.o

Then I get this error:

In file included from external/com_google_googletest/googletest/include/gtest/gtest.h:62:
In file included from external/com_google_googletest/googletest/include/gtest/internal/gtest-internal.h:40:
In file included from external/com_google_googletest/googletest/include/gtest/internal/gtest-port.h:395:
/opt/rh/devtoolset-11/root/usr/include/c++/11/bits/regex.h:56:9: fatal error: use of undeclared identifier 'regex_constants'
                      regex_constants::match_flag_type     __flags);

What could be the reason for the error? Is there an incompatibility between gcc and clang? Should I instead install clang headers and libc++ and is that made by installing package llvm-dev?


Solution

  • The gtest-port.h file includes a file with #include <regex.h> (see here for the code). It expects the file to be the POSIX regex.h which is normally installed directly under the prefix /usr/include. As you can see in the error message, the compiler instead tries to include the /usr/include/c++/11/bits/regex.h which is the wrong file.

    The header files in .../bits/ are not meant to be included directly by user code. The are internal to the standard library implementation. Thus it is no surprise to me, that directly including it fails (the missing symbol is probably defined in another internal header file).

    To solve your problem I suggest you try to leave out the .../bits directories* in your compile command. I do not know who told you to include them, but they are not meant to be added to the compiler search path.

    * drop these two flags from the compiler command line:

    -isystem /opt/rh/devtoolset-11/root/usr/include/c++/11/bits
    -isystem /opt/rh/devtoolset-11/root/include/c++/11/x86_64-redhat-linux/bits