Question

Consider the following code, which uses a function with variable arguments:

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

Compiling this with g++ 4.7.3 works fine, and running produces 1024.0 as expected.

Compiling using icpc 14.0.2 crashes it...

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

    run_func(f, &value);
    ^

Compiling with clang 3.5.0-1 gives the following error message:

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

Is this a bug, or should have g++ not compiled this?

Why is clang deducing these "conflicting" types of double and <double>, is <double> meant to represent an unpacked arglist for example?

Update icpc 14.0.3 does not crash, and the program compiles and runs correctly.

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

Was it helpful?

Solution

Following the above discussion, it seems that this is indeed a bug in clang.

As pointed out by gha.st, skipping template using and using the native function type directly works:

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

I have a filed a bug against this here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top