c++: premature overload resolution [PR93085]
We can't resolve the call to foo<42> before instantiation of G, because the template parameter of #1 has dependent type. But we were missing that in our dependency check, because the tree walk of DECL_TEMPLATE_PARMS doesn't look into the types of template parameters. So look at them directly. gcc/cp/ChangeLog: PR c++/93085 * pt.c (uses_outer_template_parms): Handle non-type and template template parameters specifically. gcc/testsuite/ChangeLog: PR c++/93085 * g++.dg/template/dependent-tmpl1.C: New test.
This commit is contained in:
parent
7650259de8
commit
84081e2c6b
2 changed files with 25 additions and 5 deletions
21
gcc/cp/pt.c
21
gcc/cp/pt.c
|
@ -10846,11 +10846,22 @@ uses_outer_template_parms (tree decl)
|
|||
&depth, NULL, /*include_nondeduced_p=*/true))
|
||||
return true;
|
||||
if (PRIMARY_TEMPLATE_P (decl)
|
||||
&& for_each_template_parm (INNERMOST_TEMPLATE_PARMS
|
||||
(DECL_TEMPLATE_PARMS (decl)),
|
||||
template_parm_outer_level,
|
||||
&depth, NULL, /*include_nondeduced_p=*/true))
|
||||
return true;
|
||||
|| DECL_TEMPLATE_TEMPLATE_PARM_P (decl))
|
||||
{
|
||||
tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (decl));
|
||||
for (int i = TREE_VEC_LENGTH (parms) - 1; i >= 0; --i)
|
||||
{
|
||||
tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
|
||||
if (TREE_CODE (parm) == PARM_DECL
|
||||
&& for_each_template_parm (TREE_TYPE (parm),
|
||||
template_parm_outer_level,
|
||||
&depth, NULL, /*nondeduced*/true))
|
||||
return true;
|
||||
if (TREE_CODE (parm) == TEMPLATE_DECL
|
||||
&& uses_outer_template_parms (parm))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
tree ci = get_constraints (decl);
|
||||
if (ci)
|
||||
ci = CI_ASSOCIATED_CONSTRAINTS (ci);
|
||||
|
|
9
gcc/testsuite/g++.dg/template/dependent-tmpl1.C
Normal file
9
gcc/testsuite/g++.dg/template/dependent-tmpl1.C
Normal file
|
@ -0,0 +1,9 @@
|
|||
// PR c++/93085
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
template<class T>
|
||||
struct G {
|
||||
template<T> static int foo(); // #1
|
||||
template<int> static int foo(); // #2
|
||||
int x = foo<42>(); // OK
|
||||
};
|
Loading…
Add table
Reference in a new issue