diff options
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/regress2.C | 17 |
3 files changed, 22 insertions, 0 deletions
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 <jason@redhat.com> + 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> int split_at; +} +struct A { + decltype(0) operator()(); +}; +template <typename> A make; +struct Tuple; +auto check = + [](auto, auto, auto) { [](auto... xs) { [=] { make<Tuple>(xs...); }; }(); }; +int main() { + namespace vd = detail; + check(vd::split_at<0>, make<Tuple>, make<Tuple>); +} |