Clang: ошибка вывода шаблона "double " vs""

рассмотрим следующий код, который использует функцию с переменными аргументами:

#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("%fn", value);
}

компиляция этого с g++ 4.7.3 отлично работает, и запуск производит 1024.0 как и ожидалось.

компиляции через мцпп 14.0.2 падает он...

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

    run_func(f, &value);
    ^

компиляция с clang 3.5.0-1 дает следующее сообщение об ошибке:

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) {
     ^

это ошибка, или g++ не должен компилировать это?

почему clang выводит эти "конфликтующие" типы double и <double>, is <double> предназначен для представления распакованного arglist, например?

обновление icpc 14.0.3 не аварийно завершает работу, и программа компилируется и запускается правильно.

см. DPD200244439 at процессор Intel® композитор Хе составители 2013 SP1 устраняет списка

1 ответов


после вышеизложенного обсуждения кажется, что это действительно ошибка в clang.

Как указано гха.st, пропуск template using и использование собственного типа функции напрямую работает:

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

у меня есть поданная ошибка против этого здесь.