http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56304
Bug #: 56304 Summary: [C++1] ICE in get_expr_operands, at tree-ssa-operands.c for template class, using lambda with closure on member variable, also called by the constructor Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: crill...@tiscali.it This bug is similar to 56303, but gives a slightly different error message: in get_expr_operands, at tree-ssa-operands.c. The differences from 56303 case are: 1) a function f() is called from the constructor 2) in f(), a reference to a member variable is created and passed to a lambda So, the program is a C++11 program on GCC 4.7.2, targeting MinGW on Windows 7 64 bit. I've also checked that the same error is generated on GCC 4.7.1 on a linux virtual machine (opensuse 12.2 64bit on VirtualBox, hosted by my Windows 7 64 bit operating system). As requested on instructions, I have used the -Wall -Wextra -fno-strict-aliasing -fwrapv options to better detect errors in code but that didn't change the result. I also used -pedantic, idem. I used -save-temps to save the ii file that I attach to this post. The error is "get_expr_operands, at tree-ssa-operands.c". I attach the .ii file generated by the compiler (4.7.2 on Windows 7 64bit). The program is : //////////////////////////////////// #include <algorithm> #include <vector> #include <set> using namespace std; template<class elements_it> class my_iterator { public: my_iterator( elements_it elements_begin, elements_it elements_end) : elements_begin_(elements_begin), elements_end_(elements_end), elements_used(distance(elements_begin, elements_end)) { f(); } void f() { size_t &ii = i; for_each(elements_begin_, elements_end_, [&](typename elements_it::value_type) { if(elements_used[ii]) return; g(); }); } void g() { } private: elements_it elements_begin_; elements_it elements_end_; size_t i; vector<int> elements_used; }; int main(int, char **) { set<int> elements1 = { 1, 2, 3 }; my_iterator<set<int>::iterator> i1(begin(elements1), end(elements1)); } //////////////////////////////////// I get the following compiler error: >g++ -pedantic -Wall -Wextra -fno-strict-aliasing -fwrapv -save-temps --st d=c++11 test_enumeration1.cpp -o test_enumeration1_gpp.exe test_enumeration1.cpp: In lambda function: test_enumeration1.cpp:50:1: internal compiler error: in get_expr_operands, at tree-ssa-operands.c:1035 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions.