https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83582
Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |ASSIGNED Last reconfirmed| |2017-12-29 Assignee|unassigned at gcc dot gnu.org |marxin at gcc dot gnu.org Ever confirmed|0 |1 Severity|normal |enhancement --- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> --- Confirmed, ICF is called for: std::__introsort_loop<int*, long int, __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:17, auto:18)> > > (int * __first, int * __last, long int __depth_limit, struct _Iter_comp_iter __comp) and std::__introsort_loop<int*, long int, __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:15, auto:16)> > > (int * __first, int * __last, long int __depth_limit, struct _Iter_comp_iter __comp) and we bail out because of last argument is different: $24 = void (gdb) p debug_tree(parm1) <record_type 0x7ffff5ef87e0 _Iter_comp_iter needs-constructing type_1 type_5 type_6 QI size <integer_cst 0x7ffff6814f60 type <integer_type 0x7ffff68310a8 bitsizetype> constant 8> unit-size <integer_cst 0x7ffff6814f78 type <integer_type 0x7ffff6831000 sizetype> constant 1> align:8 warn_if_not_align:0 symtab:0 alias-set 38 canonical-type 0x7ffff5ef87e0 fields <function_decl 0x7ffff5efac00 __ct type <method_type 0x7ffff5efcd20 type <void_type 0x7ffff6831f18 void> QI size <integer_cst 0x7ffff6814f60 8> unit-size <integer_cst 0x7ffff6814f78 1> align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff5efcc78 method basetype <record_type 0x7ffff5ef87e0 _Iter_comp_iter> arg-types <tree_list 0x7ffff5efe190 value <pointer_type 0x7ffff5ef8a80> chain <tree_list 0x7ffff5efe168 value <reference_type 0x7ffff5efcbd0> chain <tree_list 0x7ffff6827898 value <void_type 0x7ffff6831f18 void>>>> throws <tree_list 0x7ffff6968d98 purpose <deferred_noexcept 0x7ffff6951c48>>> abstract external in_system_header autoinline decl_3 decl_5 QI /home/marxin/bin/gcc/include/c++/8.0.0/bits/predefined_ops.h:130:12 align:16 warn_if_not_align:0 context <record_type 0x7ffff5ef87e0 _Iter_comp_iter> full-name "constexpr __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:17, auto:18)> >::_Iter_comp_iter(__gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:17, auto:18)> >&&) noexcept (<uninstantiated>)" not-really-extern chain <function_decl 0x7ffff5efae00 __ct_base type <method_type 0x7ffff5efcd20> external in_system_header autoinline decl_3 decl_5 QI /home/marxin/bin/gcc/include/c++/8.0.0/bits/predefined_ops.h:130:12 align:16 warn_if_not_align:0 context <record_type 0x7ffff5ef87e0 _Iter_comp_iter> abstract_origin <function_decl 0x7ffff5efac00 __ct > full-name "constexpr __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:17, auto:18)> >::_Iter_comp_iter(__gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:17, auto:18)> >&&) noexcept (<uninstantiated>)" not-really-extern chain <function_decl 0x7ffff5efad00 __ct_comp >>> context <namespace_decl 0x7ffff6149ab0 __ops> full-name "struct __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:17, auto:18)> >" needs-constructor X(constX&) this=(X&) n_parents=0 use_template=1 interface-unknown pointer_to_this <pointer_type 0x7ffff5ef8a80> reference_to_this <reference_type 0x7ffff5efcb28> chain <type_decl 0x7ffff5ef0ab0 _Iter_comp_iter>> $25 = void (gdb) p debug_tree(parm2) <record_type 0x7ffff5ef3000 _Iter_comp_iter needs-constructing type_1 type_5 type_6 QI size <integer_cst 0x7ffff6814f60 type <integer_type 0x7ffff68310a8 bitsizetype> constant 8> unit-size <integer_cst 0x7ffff6814f78 type <integer_type 0x7ffff6831000 sizetype> constant 1> align:8 warn_if_not_align:0 symtab:0 alias-set 34 canonical-type 0x7ffff5ef3000 fields <function_decl 0x7ffff5ef5b00 __ct type <method_type 0x7ffff5ef8690 type <void_type 0x7ffff6831f18 void> QI size <integer_cst 0x7ffff6814f60 8> unit-size <integer_cst 0x7ffff6814f78 1> align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff5ef85e8 method basetype <record_type 0x7ffff5ef3000 _Iter_comp_iter> arg-types <tree_list 0x7ffff5e61be0 value <pointer_type 0x7ffff5ef32a0> chain <tree_list 0x7ffff5e61bb8 value <reference_type 0x7ffff5ef8540> chain <tree_list 0x7ffff6827898 value <void_type 0x7ffff6831f18 void>>>> throws <tree_list 0x7ffff6968d98 purpose <deferred_noexcept 0x7ffff6951c48>>> abstract external in_system_header autoinline decl_3 decl_5 QI /home/marxin/bin/gcc/include/c++/8.0.0/bits/predefined_ops.h:130:12 align:16 warn_if_not_align:0 context <record_type 0x7ffff5ef3000 _Iter_comp_iter> full-name "constexpr __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:15, auto:16)> >::_Iter_comp_iter(__gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:15, auto:16)> >&&) noexcept (<uninstantiated>)" not-really-extern chain <function_decl 0x7ffff5ef5d00 __ct_base type <method_type 0x7ffff5ef8690> external in_system_header autoinline decl_3 decl_5 QI /home/marxin/bin/gcc/include/c++/8.0.0/bits/predefined_ops.h:130:12 align:16 warn_if_not_align:0 context <record_type 0x7ffff5ef3000 _Iter_comp_iter> abstract_origin <function_decl 0x7ffff5ef5b00 __ct > full-name "constexpr __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:15, auto:16)> >::_Iter_comp_iter(__gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:15, auto:16)> >&&) noexcept (<uninstantiated>)" not-really-extern chain <function_decl 0x7ffff5ef5c00 __ct_comp >>> context <namespace_decl 0x7ffff6149ab0 __ops> full-name "struct __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(auto:15, auto:16)> >" needs-constructor X(constX&) this=(X&) n_parents=0 use_template=1 interface-unknown pointer_to_this <pointer_type 0x7ffff5ef32a0> reference_to_this <reference_type 0x7ffff5ef8498> chain <type_decl 0x7ffff5ef0260 _Iter_comp_iter>> which is a compiler generated record with function pointers (which can be proved to be equal). That's another level of comparison that we are currently unable to do.