This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/79138] New: ICE when trying to do template auto


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]