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 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

 

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

Leave a Comment

Please sign in to add a comment. Not a member? Join today