[Bug c++/60033] ICE in retrieve_specialization while compiling recursive generic lambda

abutcher at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Feb 4 00:51:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60033

Adam Butcher <abutcher at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |abutcher at gcc dot gnu.org

--- Comment #3 from Adam Butcher <abutcher at gcc dot gnu.org> ---
The following reduced test case gives the same ICE:

---------------------------
#include <utility>

template <typename Func>
auto compose(Func&& f) {
  return f;
}

template <typename Func, typename... Funcs>
auto compose(Func&& f, Funcs&&... fs) {
  return [&] (auto v) {
    return f(compose(std::forward<Funcs>(fs)...)(v));
  };
}

int main()
{
  float v = 3.5f;
  auto func = [] (auto v) { return int(v-0.5); };
  auto t = compose([] (auto v) { return v >= 3; }, func)(v);
  auto f = compose([] (auto v) { return v > 3; }, func)(v);
  return (t == true && f == false)? 0 : 1;
}
---------------------------

'retrieve_specialization' is failing an assertion due to a mismatch between the
template argument depth and template decl depth when considering the pack
expansion of the captured 'fs' within the generic lambda:

---------------------------
|| args =>  <tree_vec 0x7ffd49d54ed8
||     elt 0 <tree_vec 0x7ffd49d54eb0
||         elt 0 <record_type 0x7ffd49d48c78 __lambda2 needs-constructing
type_5 type_6 QI
||             size <integer_cst 0x7ffd49df1280 constant 8>
||             unit size <integer_cst 0x7ffd49df12a0 constant 1>
||             align 8 symtab 0 alias set -1 canonical type 0x7ffd49d48c78
fields <type_decl 0x7ffd49d41b80 __lambda2> context <function_decl
0x7ffd49d2bc00 main>
||             full-name "struct main()::<lambda(auto:3)>"
||             needs-constructor X() has-type-conversion X(constX&) this=(X&)
n_parents=0 use_template=0 interface-unknown
||             pointer_to_this <pointer_type 0x7ffd49d4b9d8> reference_to_this
<reference_type 0x7ffd49d510a8> chain <type_decl 0x7ffd49d41ac8 __lambda2>>
||         elt 1 <type_argument_pack 0x7ffd49d56a80
||             type <tree_vec 0x7ffd49d53a20 elt 0 <reference_type
0x7ffd49d48930>>
||             VOID
||             align 8 symtab 0 alias set -1 canonical type 0x7ffd49d56a80>>
||     elt 1 <tree_vec 0x7ffd49d53a40
||         elt 0 <real_type 0x7ffd49e02348 float type_6 SF
||             size <integer_cst 0x7ffd49df1440 constant 32>
||             unit size <integer_cst 0x7ffd49df1460 constant 4>
||             align 32 symtab 0 alias set -1 canonical type 0x7ffd49e02348
precision 32
||             pointer_to_this <pointer_type 0x7ffd49e02540>>>>
|| tmpl =>  <field_decl 0x7ffd49d34ab0 __fs
||     type <type_pack_expansion 0x7ffd49d450a8
||         type <reference_type 0x7ffd49d45000 type <decltype_type
0x7ffd49d40f18>
||             unsigned DI
||             size <integer_cst 0x7ffd49df10c0 constant 64>
||             unit size <integer_cst 0x7ffd49df10e0 constant 8>
||             align 64 symtab 0 alias set -1 structural equality>
||         tree_0 VOID
||         align 8 symtab 0 alias set -1 structural equality>
||     used decl_7 VOID file gcc/testsuite/g++.dg/cpp1y/pr60033.C line 15 col
42
||     align 1 offset_align 1 context <record_type 0x7ffd49d40000 __lambda0>
chain <type_decl 0x7ffd49d410b8 __lambda0>>
|| TMPL_ARGS_DEPTH (args) => 2
|| TREE_CODE (tmpl) == TEMPLATE_DECL => 0
|| template_class_depth (DECL_CONTEXT (tmpl)) => 1
---------------------------



More information about the Gcc-bugs mailing list