re PR c++/67152 ([concepts] bogus "partial specialization of ‘foo<T>’ after instantia...
authorJason Merrill <jason@redhat.com>
Sat, 8 Aug 2015 22:01:39 +0000 (18:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 8 Aug 2015 22:01:39 +0000 (18:01 -0400)
PR c++/67152
* pt.c (process_partial_specialization): Call
associate_classtype_constraints.

From-SVN: r226739

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/concepts/partial-spec6.C [new file with mode: 0644]

index f04b15c0f628a815a43cbd7ef3bd15f4f6429638..786ec107846fa1b6bb3a7cdf7f0df223badf404e 100644 (file)
@@ -1,5 +1,9 @@
 2015-08-08  Jason Merrill  <jason@redhat.com>
 
+       PR c++/67152
+       * pt.c (process_partial_specialization): Call
+       associate_classtype_constraints.
+
        PR c++/67159
        * constraint.cc (finish_template_introduction):
        SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT.
index e05d77517bab4e754f5b8e2d6334d86bd4827fa7..ecd86e4397f8b4e902d73ac0375c9386bc62ee40 100644 (file)
@@ -4672,6 +4672,8 @@ process_partial_specialization (tree decl)
     /* We didn't register this in check_explicit_specialization so we could
        wait until the constraints were set.  */
     decl = register_specialization (decl, maintmpl, specargs, false, 0);
+  else
+    associate_classtype_constraints (type);
 
   DECL_TEMPLATE_SPECIALIZATIONS (maintmpl)
     = tree_cons (specargs, tmpl,
diff --git a/gcc/testsuite/g++.dg/concepts/partial-spec6.C b/gcc/testsuite/g++.dg/concepts/partial-spec6.C
new file mode 100644 (file)
index 0000000..2196fcd
--- /dev/null
@@ -0,0 +1,24 @@
+// PR c++/67152
+// { dg-options -std=c++1z }
+
+template <class T>
+concept bool HasType = requires { typename T::type; };
+
+template<class T>
+struct trait {
+  using type = void;
+};
+
+struct has_type { using type = void; };
+
+// Instantiation here
+trait<has_type>::type foo() {}
+
+// constrained version here. Type "has_type" would fail this
+// constraint so this partial specialization would not have been
+// selected.
+template<class T>
+  requires !HasType<T>
+struct trait<T> {
+  using type = void;
+};