2016-09-03 2 views
2

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?

Antwort

1

Nach dem Testen anderer Compiler, erscheint dies Variable Vorlage Code-Generierung Bug in Clang, da der Code alles in g ++ richtig analysiert.

Neben der expliziten Spezialisierung snafu oben, Clang Drosseln auch (dh compiliert, gibt aber einen falschen Code, der die Eingabe nicht analysieren kann) auf variable Schablone Geist-X3-Parser, die nicht explizit spezialisiert:

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

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

Live Example Hier werden nur Positionszeichenfolgen in numerischer Form analysiert, und alle algebraischen Zeichenfolgen werden falsch behandelt (für die keine explizite Spezialisierung angegeben wurde).

und funktioniert nur, wenn die allgemeine variable Vorlage für alle Fälle spezialisiert, die aufgerufen werden:

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); 

Ich habe nicht in der Lage gewesen, einen kleinen reduzierten Testfall zu finden, den Clang Bug isoliert.

Verwandte Themen