https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65635
Bug ID: 65635
Summary: [c++-concepts] ICE in cp_tree_equal() during class
template partial specialization constraint matching
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: tom at honermann dot net
Encountered with the latest revision of the gcc c++-concepts branch (r221742).
An internal compiler error occurs when matching constrained class template
partial specializations.
$ svn info # From my local svn gcc repo.
Path: .
URL: svn://gcc.gnu.org/svn/gcc/branches/c++-concepts
Repository Root: svn://gcc.gnu.org/svn/gcc
Repository UUID: 138bc75d-0d04-0410-961f-82ee72b054a4
Revision: 221742
Node Kind: directory
Schedule: normal
Last Changed Author: asutton
Last Changed Rev: 221733
Last Changed Date: 2015-03-27 10:44:22 -0400 (Fri, 27 Mar 2015)
$ cat t.cpp
template<typename T>
concept bool Subsumed() {
return requires () { typename T::type1; };
}
template<typename T>
concept bool Subsuming() {
return Subsumed<T>()
&& requires () { typename T::type2; };
}
struct M {
using type1 = int;
using type2 = int;
};
template<typename T>
concept bool C() {
return requires () {
typename T::force_instantiation;
};
}
template<typename T>
struct TM;
template<Subsumed T>
struct TM<T> {};
template<Subsuming T>
struct TM<T> {};
static_assert(C<TM<M>>(), "");
$ g++ -c -std=c++1z t.cpp
t.cpp:20:28: internal compiler error: in cp_tree_equal, at cp/tree.c:3037
typename T::force_instantiation;
^
0x7c7a6f cp_tree_equal(tree_node*, tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/tree.c:3037
0x7c7a0e cp_tree_equal(tree_node*, tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/tree.c:3028
0x82f7d2 match_terms
../../gcc-c++-concepts2/c++-concepts/gcc/cp/logic.cc:384
0x82f7d2 subsumes_atomic_constraint
../../gcc-c++-concepts2/c++-concepts/gcc/cp/logic.cc:394
0x82f7d2 subsumes_constraint
../../gcc-c++-concepts2/c++-concepts/gcc/cp/logic.cc:445
0x82f94f subsumes_conjunction
../../gcc-c++-concepts2/c++-concepts/gcc/cp/logic.cc:406
0x82f94f subsumes_constraint
../../gcc-c++-concepts2/c++-concepts/gcc/cp/logic.cc:439
0x82faee subsumes_constraints_nonnull
../../gcc-c++-concepts2/c++-concepts/gcc/cp/logic.cc:463
0x82faee subsumes(tree_node*, tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/logic.cc:481
0x82f554 more_constrained(tree_node*, tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/constraint.cc:2089
0x6899dd most_specialized_partial_spec
../../gcc-c++-concepts2/c++-concepts/gcc/cp/pt.c:20019
0x6afb0c instantiate_class_template_1
../../gcc-c++-concepts2/c++-concepts/gcc/cp/pt.c:9634
0x6afb0c instantiate_class_template(tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/pt.c:10174
0x74f2cb complete_type(tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/typeck.c:146
0x68bc7d tsubst(tree_node*, tree_node*, int, tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/pt.c:13001
0x67574b tsubst_decl
../../gcc-c++-concepts2/c++-concepts/gcc/cp/pt.c:11807
0x68b9c6 tsubst(tree_node*, tree_node*, int, tree_node*)
../../gcc-c++-concepts2/c++-concepts/gcc/cp/pt.c:12388
0x82eb81 tsubst_type_requirement
../../gcc-c++-concepts2/c++-concepts/gcc/cp/constraint.cc:1390
0x82eb81 tsubst_requirement
../../gcc-c++-concepts2/c++-concepts/gcc/cp/constraint.cc:1426
0x82eb81 tsubst_requirement_body
../../gcc-c++-concepts2/c++-concepts/gcc/cp/constraint.cc:1446