Ich habe einen funktionierenden Spirit-X3-Parser, der zwei eng verwandte Grammatiken analysieren kann, um Entwürfe und Checker-Positionen einzurichten. Ich sehe zwei variable Vorlagen Spezialisierungen als Parser für die beiden Dialekte der Grammatik:Spirit-X3-Parser, die in verschiedenen Template-Spezialisierungen gespeichert sind, arbeiten nicht am Clang
// 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 */
);
Dieser Code kompiliert und korrekt analysiert mein Testeingang, die beide auf Clang und auf g++.
Da die beiden variablen Vorlage Spezialisierungen sind abhängig von der Template-Parameter in der exakt gleichen Form, ich möchte sie in einer allgemeinen Variable Vorlage konsolidieren:
template<class Format>
auto const position = attribute_cast<ast::position<Format>>
(
/* code depending on Format, omitted for brevity */
);
Dies kompiliert auch und parst richtig für g++. Es kompiliert auch für Clang, aber es analysiert nur korrekt meine Eingabe auf Wandbox und nicht auf Coliru. Auf meiner eigenen Dev Box, mit clang-3.8.0 von apt.llvm.org, bekomme ich das gleiche Fehlverhalten wie auf Coliru.
Frage: Gibt es einen Bug in Clang für variable Vorlagenspezialisierungen? Wie kann ich Clang wie bei Wandbox konfigurieren, um diesen Fehler zu umgehen? Oder ist es irgendwie ein Spirit-X3-bezogener Bug?