несовместимость clang с отложенным разбором шаблонов, std :: filesystem и предварительно скомпилированными заголовками? - PullRequest
1 голос
/ 10 января 2020

У меня очень большой проект преобразования MSV C в clang, который требует отложенного синтаксического анализа шаблона, используя опцию -fdelayed-template-parsing в clang. Мне также нужно использовать предварительно скомпилированные заголовки, иначе компиляция будет монументально медленной. К сожалению, из-за определенного включения, std :: filesystem, компилятор повалил меня на очень простой случай. Простейший случай, с которым я могу проиллюстрировать проблему, заключается в следующем. Это работает:

[root@836b485f209d pch]# cat foobar.cpp
#include <stdio.h>

int main()
{
   printf("Hello world\n");
}
[root@836b485f209d pch]# cat CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(foobar)

set(CMAKE_CXX_FLAGS "-std=c++17")
add_executable(foobar foobar.cpp)
target_precompile_headers(foobar PUBLIC
        <stdio.h>
        <filesystem>
)
[root@836b485f209d pch]#

Но в тот момент, когда я изменяю CMakeLists.txt, чтобы включить отложенный синтаксический анализ шаблона:

cmake_minimum_required(VERSION 3.16)
project(foobar)

set(CMAKE_CXX_FLAGS "-std=c++17 -fdelayed-template-parsing")
add_executable(foobar foobar.cpp)
target_precompile_headers(foobar PUBLIC
        <stdio.h>
        <filesystem>
)

Компилятор обрушится на меня со множеством ошибок в stl_algobase.h (это не полный список, просто образец):

/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/../../../../include/c++/8/bits/stl_algobase.h:381:24: error:
      expected '('
                             && __is_pointer<_II>::__value
                                            ^
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/../../../../include/c++/8/bits/stl_algobase.h:381:25: error:
      '_II' does not refer to a value
                             && __is_pointer<_II>::__value
                                             ^
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/../../../../include/c++/8/bits/stl_algobase.h:385:40: error:
      non-type template argument is not a constant expression
      return std::__copy_move<_IsMove, __simple,
                                       ^
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/../../../../include/c++/8/bits/stl_algobase.h:380:18: error:
      default initialization of an object of const type 'const bool'
      const bool __simple = (__is_trivial(_ValueTypeI)

Могу ли я что-нибудь сделать? Мне нужно сочетание предварительно скомпилированных заголовков, std :: filesystem и отложенного синтаксического анализа шаблона.

Обновление: мне пришлось изменить много кода в проекте, чтобы избежать необходимости отложенного синтаксического анализа шаблона. Это позволяет избежать этой проблемы, но все равно меня беспокоит то, что стандартная библиотека не работает с отложенным разбором шаблонов.

...