2014-05-12 7 views
9

Betrachten Sie den folgenden Code fehlgeschlagen ist, die eine Funktion mit variabler Argumente verwendet:Clang: Template Abzug 'double' vs '<double>'

#include <iostream> 

// Typedef function type 
template<typename... Output> 
using Func = void(Output*...); 

// Function runner 
template<typename... Output> 
void run_func(Func<Output...>& func, Output*... output) { 
    for (int i=0 ; i < 10 ; ++i) { 
    func(output...); 
    } 
} 

void f(double* d) { 
    *d *= 2; 
}; 

int main() { 
    double value = 1.0; 
    run_func(f, &value); 
    printf("%f\n", value); 
} 

diese Kompilieren mit g ++ 4.7.3 funktioniert gut, und Laufen erzeugt 1024.0 als erwartet.

mit Kompilieren icpc 14.0.2 stürzt ...

templ.cc(21): internal error: assertion failed: lower_expr: bad kind (shared/cfe/edgcpfe/lower_il.c, line 18582) 

    run_func(f, &value); 
    ^

mit Klirren Kompilieren 3.5.0-1 gibt die folgende Fehlermeldung:

templ.cc:21:3: error: no matching function for call to 'run_func' 
    run_func(f, &value); 
    ^~~~~~~~ 
templ.cc:9:6: note: candidate template ignored: deduced conflicting types for parameter 'Output' ('double' vs. <double>) 
void run_func(Func<Output...>& func, Output*... output) { 
    ^

Ist das ein Bug, oder sollte habe g ++ das nicht kompiliert?

Warum ist klirrt diese „widersprüchlichen“ Arten von double und <double> herzuleiten ist <double> bedeutet eine entpackte arglist zum Beispiel zu vertreten?

Update Icpc 14.0.3 stürzt nicht ab, und das Programm kompiliert und läuft korrekt.

See DPD200244439 bei Intel® Composer XE 2013 SP1 Compilers Fixes List

+0

Ihre letzte Frage, die Sie selbst beantworten konnten, indem Sie run_func (f, & value, & value) übergeben ... was zu führt, was ich nicht für richtig halte ... Sie könnten es mit einem mehr versuchen recent clang von svn, es riecht nach einem Bug – PlasmaHH

+6

Da das Ersetzen der 'template using' durch den nativen Typ das Problem verschwinden lässt, fühlt es sich sehr nach einem Bug an. –

+0

@PlasmaHH Ich versuchte kling Version 3.5.0 (Stamm 208562), das gleiche Problem! – WaelJ

Antwort

1

Nach der obigen Diskussion, so scheint es, dass dies tatsächlich ein Fehler in Klirren.

Wie bereits von gha.st aus, template using und mit dem nativen Funktionstyp direkt funktioniert das Überspringen:

void run_func(void (&func)(Output*...), Output*... output) { 

Ich habe ein erstattete Bug gegen diese here.