Fix constraint satisfaction in uninstantiated template.
authorJason Merrill <jason@redhat.com>
Tue, 21 Jun 2016 18:19:13 +0000 (14:19 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 21 Jun 2016 18:19:13 +0000 (14:19 -0400)
* constraint.cc (constraints_satisfied_p): Keep as many levels of
args as our template has levels of parms.

From-SVN: r237655

gcc/cp/ChangeLog
gcc/cp/constraint.cc
gcc/testsuite/g++.dg/concepts/memtmpl1.C [new file with mode: 0644]

index c8aa71360e2a98ec29f19ccb72091c8a32913055..20e34d677ee81602f2f1a30288e30743837f2fcd 100644 (file)
@@ -1,5 +1,8 @@
 2016-06-21  Jason Merrill  <jason@redhat.com>
 
+       * constraint.cc (constraints_satisfied_p): Keep as many levels of
+       args as our template has levels of parms.
+
        * pt.c (template_parm_outer_level, uses_outer_template_parms): New.
        (type_dependent_expression_p): Use uses_outer_template_parms.
 
index 5e42fa90104dbcb6259f9d659fcf5fee0c953102..af7a593a4f66b05cbccb03d00244d02e47060145 100644 (file)
@@ -2122,8 +2122,10 @@ constraints_satisfied_p (tree decl)
   tree args = NULL_TREE;
   if (tree ti = DECL_TEMPLATE_INFO (decl))
     {
-      ci = get_constraints (TI_TEMPLATE (ti));
-      args = INNERMOST_TEMPLATE_ARGS (TI_ARGS (ti));
+      tree tmpl = TI_TEMPLATE (ti);
+      ci = get_constraints (tmpl);
+      int depth = TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl));
+      args = get_innermost_template_args (TI_ARGS (ti), depth);
     }
   else
     {
diff --git a/gcc/testsuite/g++.dg/concepts/memtmpl1.C b/gcc/testsuite/g++.dg/concepts/memtmpl1.C
new file mode 100644 (file)
index 0000000..6f3d5a3
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-options "-std=c++1z -fconcepts" }
+
+template <class T>
+struct A {
+  template <class U>
+  requires sizeof(T) == 1
+    static void f(U);
+  template <class U>
+  requires sizeof(T) == 2
+    static void f(U);
+  void g()
+  {
+    f(42);
+  }
+};