From d6729a4291a69749ea7faf55bba2c4520ca6a6a9 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 8 Aug 2015 18:01:21 -0400 Subject: [PATCH] re PR c++/67142 ([C++1z] ICE: tree check: expected template_decl, have field_decl in equal, at cp/pt.c:1665) PR c++/67142 * pt.c (equal): Make sure tmpl is actually a template. From-SVN: r226737 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 2 ++ gcc/testsuite/g++.dg/cpp1z/regress2.C | 17 +++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1z/regress2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 40ed123c961..32392395a22 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2015-08-08 Jason Merrill + PR c++/67142 + * pt.c (equal): Make sure tmpl is actually a template. + PR c++/67114 * call.c (joust): Only call more_constrained on decls. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1b641746531..e05d77517ba 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -1662,6 +1662,8 @@ spec_hasher::equal (spec_entry *e1, spec_entry *e2) equal = (e1->tmpl == e2->tmpl && comp_template_args (e1->args, e2->args)); if (equal && flag_concepts + /* tmpl could be a FIELD_DECL for a capture pack. */ + && TREE_CODE (e1->tmpl) == TEMPLATE_DECL && VAR_P (DECL_TEMPLATE_RESULT (e1->tmpl)) && uses_template_parms (e1->args)) { diff --git a/gcc/testsuite/g++.dg/cpp1z/regress2.C b/gcc/testsuite/g++.dg/cpp1z/regress2.C new file mode 100644 index 00000000000..d9bf0daa7dd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/regress2.C @@ -0,0 +1,17 @@ +// PR c++/67142 +// { dg-options -std=c++1z } + +namespace detail { +template int split_at; +} +struct A { + decltype(0) operator()(); +}; +template A make; +struct Tuple; +auto check = + [](auto, auto, auto) { [](auto... xs) { [=] { make(xs...); }; }(); }; +int main() { + namespace vd = detail; + check(vd::split_at<0>, make, make); +} -- 2.30.2