Possible bug with variadic templates and initializer list?

Possible bug with variadic templates and initializer list?

Hi,

If I try to compile

#include<initializer_list>
#include<iostream>
void foo(std::initializer_list<int> a) {
  for(auto b : a)
    std::cout << b << std::endl;
}
template<class... VALUES> 
void callFoo(VALUES... values) {
  foo({values...});
}
int main() {
  callFoo(1,2,3);
}

Intel Composer XE 2014 (on Windows) says:

error: no instance of function template "foo" matches the argument list
            argument types are: (A<double, int>)
    foo<double, int>(A<double, int>());

 

I believe this is a bug since it compiles without problems using gcc 4.8.2. and clang 3.4 on linux. Would it be possible to fix this in one of the upcoming releases?

Raffael

3 Beiträge / 0 neu
Letzter Beitrag
Nähere Informationen zur Compiler-Optimierung finden Sie in unserem Optimierungshinweis.

 

I can't reproduce this. It compiles fine when I tried it with our latest 14.0 development compiler.

Are you using MSVC++ 2013 (I assume you are or else it wouldn't find the initializer_list header file)?

Are you using 14.0 Update 1? Are you using any special switches?

If I try a compiler that was released around the same time as Update 1, I see this internal error. This was fixed in December 2013.

!%  //ssgfs001/cmplrarch/SWF/deploy_14_0/x86win/20131009_000000/build/win_debug/
bin/ia32/icl -c -w -Qstd=c++11 t2.cpp
Intel(R) C++ Compiler XE for applications running on IA-32, Version 14.0 Beta Bu
ild x
Built Oct  9 2013 05:33:54 by nbtester on SCXWQA85 in d:/users/nbtester/x86win_n
ightly/branch-14_0/20131009_000000/dev
Copyright (C) 1985-2013 Intel Corporation.  All rights reserved.

t2.cpp
t2.cpp(11): internal error: assertion failed: node_has_side_effects: bad node kind (shared/cfe/edgcpfe/il.c, line 20802)

    foo({values...});
    ^

compilation aborted for t2.cpp (code 4)

With our latest compiler it compiles successfully:

!% cat t2.cpp
#include<initializer_list>
#include<iostream>

void foo(std::initializer_list<int> a) {
  for(auto b : a)
  std::cout << b << std::endl;
}

template<class... VALUES>
void callFoo(VALUES... values) {
  foo({values...});
}

int main() {
  callFoo(1,2,3);
  return 0;
}

!% icl -c t2.cpp
Intel(R) C++ Compiler XE for applications running on IA-32, Version 14.0 Beta Build x
Built Jan  6 2014 18:06:04 by jward4 on JWARD4-DESK in D:/workspaces/14_0cfe/dev

Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

t2.cpp
!%

14.0 Update 2 is due to be released any day now so I hope this is fixed when you try it out.

But I'm not sure since I can't reproduce the same error that you are seeing..

Judy

Hi Judy,

Thanks a lot for having a look at this issue. I guess I have been a bit lazy, so here is the full description of my setup:

I have Visual Studio 2013 installed and with it comes a version of the STL that has support for initializer_lists. The exact version of MSVC is:

Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64

On the Intel side I have installed Intel Composer XE 2014 SP1 Update 1 (package 139) and I compile the c++ file as follows:

Intel(R) Parallel Studio XE 2013 SP1
Copyright (C) 1985-2013 Intel Corporation. All rights reserved.
Intel(R) Composer XE 2013 SP1 Update 1 (package 139)
 
icl variadicInitializerList.cpp /Qstd=c++11

(The environment variables have been set by executing the x64 batch script of the intel compiler:

C:Program Files (x86)IntelComposer XE 2013 SP1binipsxe-comp-vars.bat intel64 vs2013

In my case this doesn't compile at all but may be it is really fixed in the next version, lets see...

Raffael

Melden Sie sich an, um einen Kommentar zu hinterlassen.