mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-28 14:24:43 +08:00
* decl2.c (arg_assoc): Handle template-id expressions as arguments.
From-SVN: r22156
This commit is contained in:
parent
99d7f99a7f
commit
0c8bfdbc0c
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
11
gcc/testsuite/g++.old-deja/g++.pt/crash24.C
Normal file
11
gcc/testsuite/g++.old-deja/g++.pt/crash24.C
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user