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
This commit is contained in:
Jason Merrill 2015-08-08 18:01:39 -04:00 committed by Jason Merrill
parent 4e7739b25a
commit 7beb0c35aa
3 changed files with 30 additions and 0 deletions

View 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.

View 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,

View File

@ -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;
};