* decl2.c (arg_assoc): Handle template-id expressions as arguments.

From-SVN: r22156
This commit is contained in:
Mark Mitchell 1998-09-01 09:56:40 +00:00 committed by Mark Mitchell
parent 99d7f99a7f
commit 0c8bfdbc0c
3 changed files with 79 additions and 4 deletions

View File

@ -1,3 +1,7 @@
1998-09-01 Mark Mitchell <mark@markmitchell.com>
* decl2.c (arg_assoc): Handle template-id expressions as arguments.
1998-08-31 Mark Mitchell <mark@markmitchell.com>
* decl.c (finish_enum): Handle member enums of classes declared in

View File

@ -4583,11 +4583,71 @@ arg_assoc (k, n)
while (TREE_CODE (n) == TREE_LIST)
n = TREE_VALUE (n);
my_friendly_assert (TREE_CODE (n) == OVERLOAD, 980715);
if (TREE_CODE (n) == TEMPLATE_ID_EXPR)
{
/* [basic.lookup.koenig]
for (; n; n = TREE_CHAIN (n))
if (arg_assoc (k, OVL_FUNCTION (n)))
return 1;
If T is a template-id, its associated namespaces and classes
are the namespace in which the template is defined; for
member templates, the member template's class; the namespaces
and classes associated with the types of the template
arguments provided for template type parameters (excluding
template template parameters); the namespaces in which any
template template arguments are defined; and the classes in
which any member templates used as template template
arguments are defined. [Note: non-type template arguments do
not contribute to the set of associated namespaces. ] */
tree template = TREE_OPERAND (n, 0);
tree args = TREE_OPERAND (n, 1);
tree ctx;
tree arg;
/* First, the template. There may actually be more than one if
this is an overloaded function template. But, in that case,
we only need the first; all the functions will be in the same
namespace. */
template = OVL_CURRENT (template);
ctx = CP_DECL_CONTEXT (template);
if (TREE_CODE (ctx) == NAMESPACE_DECL)
{
if (arg_assoc_namespace (k, ctx) == 1)
return 1;
}
/* It must be a member template. */
else if (arg_assoc_class (k, ctx) == 1)
return 1;
/* Now the arguments. */
for (arg = args; arg != NULL_TREE; arg = TREE_CHAIN (arg))
{
tree t = TREE_VALUE (arg);
if (TREE_CODE (t) == TEMPLATE_DECL)
{
ctx = CP_DECL_CONTEXT (t);
if (TREE_CODE (ctx) == NAMESPACE_DECL)
{
if (arg_assoc_namespace (k, ctx) == 1)
return 1;
}
else if (arg_assoc_class (k, ctx) == 1)
return 1;
}
else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't'
&& arg_assoc_type (t) == 1)
return 1;
}
}
else
{
my_friendly_assert (TREE_CODE (n) == OVERLOAD, 980715);
for (; n; n = OVL_CHAIN (n))
if (arg_assoc (k, OVL_FUNCTION (n)))
return 1;
}
return 0;
}

View File

@ -0,0 +1,11 @@
// Build don't link:
template<typename T, template <class> class U> void template_fn (T);
template<typename T, typename U> void callme ( void (*)(T));
template<typename T> struct S1;
int main()
{
callme( template_fn<double, S1>); // ERROR - no matching function
}