7

(私が使用している Boost と Clang の特定のバージョンについては、質問の最後を参照してください)

新しい実験的機能を使用して master/HEAD から Clang でコンパイル-fmodulesすると、以下に示すコマンドライン オプションを使用して次のファイルをコンパイルすると、ビルド エラーが発生します。

#include <iterator>
#include <boost/move/iterator.hpp>

コンパイル コマンドとエラー:

anhall@leviathan: <path-to-clang-install-from-master>/bin/clang++ -o file.o -c file.cpp --std=c++1z -stdlib=libc++ -fmodules

In file included from file.cpp:2:
In file included from /usr/local/include/boost/move/iterator.hpp:27:
/usr/local/include/boost/move/detail/iterator_traits.hpp:60:17: error: reference to 'random_access_iterator_tag' is ambiguous
   typedef std::random_access_iterator_tag   iterator_category;
                ^
/Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:438:30: note: candidate found by name lookup is 'std::__1::random_access_iterator_tag'
struct _LIBCPP_TYPE_VIS_ONLY random_access_iterator_tag : public bidirectional_iterator_tag {};
                             ^
/usr/local/include/boost/move/detail/iterator_traits.hpp:34:8: note: candidate found by name lookup is 'std::random_access_iterator_tag'
struct random_access_iterator_tag;
       ^
/usr/local/include/boost/move/detail/iterator_traits.hpp:71:17: error: reference to 'random_access_iterator_tag' is ambiguous
   typedef std::random_access_iterator_tag   iterator_category;
                ^
/Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:438:30: note: candidate found by name lookup is 'std::__1::random_access_iterator_tag'
struct _LIBCPP_TYPE_VIS_ONLY random_access_iterator_tag : public bidirectional_iterator_tag {};
                             ^
/usr/local/include/boost/move/detail/iterator_traits.hpp:34:8: note: candidate found by name lookup is 'std::random_access_iterator_tag'
struct random_access_iterator_tag;
       ^
In file included from file.cpp:2:
/usr/local/include/boost/move/iterator.hpp:196:17: error: reference to 'output_iterator_tag' is ambiguous
   typedef std::output_iterator_tag    iterator_category;
                ^
/Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:435:30: note: candidate found by name lookup is 'std::__1::output_iterator_tag'
struct _LIBCPP_TYPE_VIS_ONLY output_iterator_tag {};
                             ^
/usr/local/include/boost/move/detail/iterator_traits.hpp:35:8: note: candidate found by name lookup is 'std::output_iterator_tag'
struct output_iterator_tag;
       ^
In file included from file.cpp:2:
/usr/local/include/boost/move/iterator.hpp:238:17: error: reference to 'output_iterator_tag' is ambiguous
   typedef std::output_iterator_tag    iterator_category;
                ^
/Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:435:30: note: candidate found by name lookup is 'std::__1::output_iterator_tag'
struct _LIBCPP_TYPE_VIS_ONLY output_iterator_tag {};
                             ^
/usr/local/include/boost/move/detail/iterator_traits.hpp:35:8: note: candidate found by name lookup is 'std::output_iterator_tag'
struct output_iterator_tag;
       ^
In file included from file.cpp:2:
/usr/local/include/boost/move/iterator.hpp:278:17: error: reference to 'output_iterator_tag' is ambiguous
   typedef std::output_iterator_tag    iterator_category;
                ^
/Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:435:30: note: candidate found by name lookup is 'std::__1::output_iterator_tag'
struct _LIBCPP_TYPE_VIS_ONLY output_iterator_tag {};
                             ^
/usr/local/include/boost/move/detail/iterator_traits.hpp:35:8: note: candidate found by name lookup is 'std::output_iterator_tag'
struct output_iterator_tag;
       ^
5 errors generated.

を削除する#include <iterator>か、 の後に移動すると#include <boost/move/iterator.hpp>、エラーが消えます。

質問:これは単なる Boost ライブラリ (特に Boost Move はどうやら) が Clang モジュール マップ ファイルを含むモジュール用に準備されていないことの副産物ですか? これは、Clang が libc++ 用に実装したモジュール マップ ファイルのバグでしょうか、それともモジュールの実装自体のバグでしょうか?

興味深いことに、次の 28 ~ 28 行目をコメントアウトすることで、エラーを解消できますboost/move/detail/iterator_traits.hpp

// #include <boost/move/detail/std_ns_begin.hpp>
// BOOST_MOVE_STD_NS_BEG
//
// struct input_iterator_tag;
// struct forward_iterator_tag;
// struct bidirectional_iterator_tag;
// struct random_access_iterator_tag;
// struct output_iterator_tag;
//
// BOOST_MOVE_STD_NS_END
// #include <boost/move/detail/std_ns_end.hpp>

使用中のバージョン

ブースト 1.61

Clang は、2016 年 12 月 7 日の時点で、LLVM の github ミラーのマスター ブランチの先端からのものです (技術的には LLVM のフォークからのものですが、LLVM 自身のマスター ブランチと同一のマスター ブランチ上にのみ存在します)。

clang version 4.0.0 (https://github.com/matus-chochlik/clang.git b9cb1c8a1ebf52695372de12c7b04c8ef1bd8b4e) (https://github.com/llvm-mirror/llvm.git b60c7b1f61eabbe971d08568adb790a7cfc6a403)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Users/anhall/impersonal/code/llvm-reflexpr/install/bin
4

2 に答える 2

4

これは、昨日r289028で修正した libc++ の module.modulemap の問題が原因だと思います。このバグにより、_LIBCPP_VERSIONモジュールが有効になっている場合、libc++ によってマクロがエクスポートされませんでした。

調べてみると、 が定義されていないboost/move/detail/iterator_traits.hpp場合、_LIBCPP_VERSION構成が失敗し、イテレータ タグのまったく異なる定義を宣言してしまうようです。(具体的にはstd、libc++ のバージョン管理名前空間ではなく、名前空間で直接定義します)。

LLVM と libc++ を再ビルドすると、問題が解決するはずです。そうでない場合は、お気軽にバグを報告してください。

PS。私は一歩先を行っているようです。

于 2016-12-09T13:28:23.643 に答える