https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69091
Bug ID: 69091 Summary: valid code with operator| causes ICE "tree check: accessed elt 2 of tree_vec with 1 elts in tsubst, at cp/pt.c:12851" Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ryan.burn at gmail dot com Target Milestone: --- The below code compiles fine with clang but causes this ICE with gcc g++ (GCC) 6.0.0 20151222 (experimental) bug.cpp:5:6: internal compiler error: tree check: accessed elt 2 of tree_vec with 1 elts in tsubst, at cp/pt.c:12851 auto operator|(Option<ValueType, Value>, OptionsRhs) { ^~~~~~~~ 0xf7ac05 tree_vec_elt_check_failed(int, int, char const*, int, char const*) ../../src-fix/gcc/tree.c:9802 0x6aff39 tree_vec_elt_check(tree_node const*, int, char const*, int, char const*) ../../src-fix/gcc/tree.h:3445 0x678dd7 tsubst(tree_node*, tree_node*, int, tree_node*) ../../src-fix/gcc/cp/pt.c:12851 0x66f740 tsubst_copy ../../src-fix/gcc/cp/pt.c:13949 0x674e68 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../src-fix/gcc/cp/pt.c:16088 0x669d88 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../src-fix/gcc/cp/pt.c:15658 0x68ed4a tsubst_template_args ../../src-fix/gcc/cp/pt.c:11108 0x681d9a tsubst_decl ../../src-fix/gcc/cp/pt.c:11607 0x678807 tsubst(tree_node*, tree_node*, int, tree_node*) ../../src-fix/gcc/cp/pt.c:12695 0x66fd7e tsubst_copy ../../src-fix/gcc/cp/pt.c:13865 0x674e68 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../src-fix/gcc/cp/pt.c:16088 0x67547b tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../src-fix/gcc/cp/pt.c:16326 0x669d88 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../src-fix/gcc/cp/pt.c:15658 0x667f07 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../src-fix/gcc/cp/pt.c:14974 0x669b88 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../src-fix/gcc/cp/pt.c:15146 0x6a8eb6 instantiate_decl(tree_node*, int, bool) ../../src-fix/gcc/cp/pt.c:21810 0x6afbeb instantiate_pending_templates(int) ../../src-fix/gcc/cp/pt.c:21927 0x6f08e1 c_parse_final_cleanups() ../../src-fix/gcc/cp/decl2.c:4589 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. ////////////////////////////////////////////////////////////// template <class ValueType, ValueType> struct Option {}; template <class ValueType, ValueType Value, class OptionsRhs> auto operator|(Option<ValueType, Value>, OptionsRhs) { return Value; } enum canine_t { no, yes }; Option<canine_t, no> cat; Option<canine_t, yes> dog; template <class T> void f(T) { cat | dog; } struct A {}; int main() { f(A{}); return 0; } //////////////////////////////////////////////////////////////