aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-08-08 18:01:39 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-08-08 18:01:39 -0400
commit7beb0c35aa0ccd44a3e7ff87eab390536ca77051 (patch)
treea8e3310ff596e0b00d98f56cd64b3e428f64b5eb /gcc
parent4e7739b25ab46d9c573222680ad2862d263c909e (diff)
downloadgcc-7beb0c35aa0ccd44a3e7ff87eab390536ca77051.zip
gcc-7beb0c35aa0ccd44a3e7ff87eab390536ca77051.tar.gz
gcc-7beb0c35aa0ccd44a3e7ff87eab390536ca77051.tar.bz2
re PR c++/67152 ([concepts] bogus "partial specialization of ‘foo<T>’ after instantiation" error)
PR c++/67152 * pt.c (process_partial_specialization): Call associate_classtype_constraints. From-SVN: r226739
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/g++.dg/concepts/partial-spec6.C24
3 files changed, 30 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f04b15c..786ec10 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e05d775..ecd86e4 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
index 0000000..2196fcd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/partial-spec6.C
@@ -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;
+};