Fix constraint satisfaction in uninstantiated template.

* constraint.cc (constraints_satisfied_p): Keep as many levels of
	args as our template has levels of parms.

From-SVN: r237655
This commit is contained in:
Jason Merrill 2016-06-21 14:19:13 -04:00 committed by Jason Merrill
parent e547455bd6
commit 2befd3f722
3 changed files with 22 additions and 2 deletions

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

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

View File

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