re PR c++/67142 ([C++1z] ICE: tree check: expected template_decl, have field_decl...
authorJason Merrill <jason@redhat.com>
Sat, 8 Aug 2015 22:01:21 +0000 (18:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 8 Aug 2015 22:01:21 +0000 (18:01 -0400)
PR c++/67142
* pt.c (equal): Make sure tmpl is actually a template.

From-SVN: r226737

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1z/regress2.C [new file with mode: 0644]

index 40ed123c961c42f8015b07d00c3ba3e82f7de107..32392395a220b0d88519435231179ae44e8b7e26 100644 (file)
@@ -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.
 
index 1b64174653195323df5949fdcae78d2224dea03f..e05d77517bab4e754f5b8e2d6334d86bd4827fa7 100644 (file)
@@ -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 (file)
index 0000000..d9bf0da
--- /dev/null
@@ -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>);
+}