This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/79138] New: ICE when trying to do template auto
- From: "barry.revzin at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 18 Jan 2017 21:06:40 +0000
- Subject: [Bug c++/79138] New: ICE when trying to do template auto
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79138
Bug ID: 79138
Summary: ICE when trying to do template auto
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: barry.revzin at gmail dot com
Target Milestone: ---
The following example:
#include <iostream>
#include <type_traits>
#include <utility>
template <auto >
struct value { };
template <auto... Vals>
struct value_sequence { };
template <auto... As, auto... Bs>
constexpr value_sequence<As..., Bs...> operator+(value_sequence<As...>,
value_sequence<Bs...> )
{
return {};
}
template <auto Val, class F>
constexpr auto filter_single(value<Val>, F predicate) {
if constexpr (predicate(Val)) {
return value_sequence<Val>{};
}
else {
return value_sequence<>{};
}
}
template <auto... Vals, class F>
constexpr auto filter(value_sequence<Vals...>, F predicate) {
return (filter_single(value<Vals>{}, predicate) + ...);
}
int main() {
constexpr auto evens = filter(
value_sequence<0, 1, 2, 3, 4, 5, 6, 7, 8, 9>{},
[](int i) constexpr { return i%2 == 0; });
}
compiles on clang head, but on gcc head on wandbox, yields:
prog.cc: In instantiation of 'constexpr auto filter_single(value<Val>, F) [with
auto Val = 0; F = main()::<lambda(int)>]':
prog.cc:30:26: required from 'constexpr auto filter(value_sequence<As ...>,
F) [with auto ...Vals = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; F =
main()::<lambda(int)>]'
prog.cc:36:49: required from here
prog.cc:21:36: internal compiler error: in tsubst, at cp/pt.c:13463
return value_sequence<Val>{};
^
0x618f06 tsubst(tree_node*, tree_node*, int, tree_node*)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:13463
0x61adb4 tsubst_template_args
/home/heads/gcc/gcc-source/gcc/cp/pt.c:11625
0x627abc tsubst_aggr_type
/home/heads/gcc/gcc-source/gcc/cp/pt.c:11837
0x618039 tsubst(tree_node*, tree_node*, int, tree_node*)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:13343
0x620909 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:17552
0x6150b7 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:16392
0x614e15 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:15656
0x614ee3 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:15870
0x615980 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:15840
0x614ee3 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:15870
0x61359a instantiate_decl(tree_node*, int, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:22797
0x64e093 maybe_instantiate_decl
/home/heads/gcc/gcc-source/gcc/cp/decl2.c:5000
0x64f598 mark_used(tree_node*, int)
/home/heads/gcc/gcc-source/gcc/cp/decl2.c:5099
0x5dcdb0 build_over_call
/home/heads/gcc/gcc-source/gcc/cp/call.c:8074
0x5e1fbf build_new_function_call(tree_node*, vec<tree_node*, va_gc,
vl_embed>**, bool, int)
/home/heads/gcc/gcc-source/gcc/cp/call.c:4272
0x6beed1 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
/home/heads/gcc/gcc-source/gcc/cp/semantics.c:2440
0x621d1f tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:17277
0x6150b7 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:16392
0x611b60 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:15631
0x611b60 gen_elem_of_pack_expansion_instantiation
/home/heads/gcc/gcc-source/gcc/cp/pt.c:10993