2

ドラフトとチェッカーの位置を設定するために、密接に関連する2つの文法を解析できる、動作中のSpirit-X3パーサーがあります。文法の 2 つの方言のパーサーとして、2つの変数テンプレートの特殊化を定義します。

// general variable template
template<class Format>
auto const position = []{};

// template specialization for algebraic notation (squares of the form "a1"-"h8")
template<>
auto const position<ast::ALG> = attribute_cast<ast::position<ast::ALG>> 
( 
    /* code depending on ast::ALG, omitted for brevity */
);

// template specialization for numeric notation (squares numbered 1 through N)  
template<>          
auto const position<ast::NUM> = attribute_cast<ast::position<ast::NUM>> 
( 
    /* code depending on ast::NUM, omitted for brevity */
);

このコードは、 Clangg++の両方で、テスト入力をコンパイルして正しく解析し ます。

2 つの変数テンプレートの特殊化はまったく同じ形式でテンプレート パラメーターに依存するため、それらを一般的な変数テンプレートに統合したいと考えています。

template<class Format>
auto const position = attribute_cast<ast::position<Format>> 
( 
    /* code depending on Format, omitted for brevity */
); 

これは、 g++に対しても正しくコンパイルおよび解析します。Clang 用にもコンパイルされますが、Coliruではなく、Wandboxでの入力のみを正しく解析します。apt.llvm.orgの clang-3.8.0 を使用した私自身の開発ボックスでは、 Coliruと同じ誤った動作が発生します。

質問: 変数テンプレートの特殊化に関する Clang のバグはありますか? そのバグを回避するために、Wandbox と同じ方法で Clang を構成するにはどうすればよいですか? それともSpirit-X3関連のバグですか?

4

1 に答える 1

1

他のコンパイラをテストした後、コードは g++ ですべてを正しく解析するため、これは Clang の可変テンプレート コード生成バグのようです。

上記の明示的な特殊化の問題に加えて、Clang は、明示的に特殊化されていない変数テンプレート Spirit-X3 パーサーをチョークします (つまり、コンパイルしますが、入力を解析できない誤ったコードを出力します)。

template<class Format>
auto piece_list = piece >> file >> rank;

template<>
auto const piece_list<ast::NUM> = piece >> square >> -('-' >> square);

数値形式の位置文字列のみを解析し、すべての代数文字列 (明示的な特殊化が指定されていない) を誤って処理するライブ例をここに示します。

一般変数テンプレートが呼び出されるすべてのケースに特化されている場合にのみ機能します。

template<class Format>
auto piece_list = 0;

template<>
auto const piece_list<ast::ALG> = piece >> file >> rank;

template<>
auto const piece_list<ast::NUM> = piece >> square >> -('-' >> square);

Clang のバグを分離する小さな縮小テスト ケースを見つけることができませんでした。

于 2016-09-03T13:53:38.517 に答える