From 0c8bfdbc0cf0ef6644da218eeb1e816f952f963f Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 1 Sep 1998 09:56:40 +0000 Subject: [PATCH] * decl2.c (arg_assoc): Handle template-id expressions as arguments. From-SVN: r22156 --- gcc/cp/ChangeLog | 4 ++ gcc/cp/decl2.c | 68 +++++++++++++++++++-- gcc/testsuite/g++.old-deja/g++.pt/crash24.C | 11 ++++ 3 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash24.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4e17539b35b..37c16b3f6cf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +1998-09-01 Mark Mitchell + + * decl2.c (arg_assoc): Handle template-id expressions as arguments. + 1998-08-31 Mark Mitchell * decl.c (finish_enum): Handle member enums of classes declared in diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 04424bf147c..7d54deca6f6 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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; } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash24.C b/gcc/testsuite/g++.old-deja/g++.pt/crash24.C new file mode 100644 index 00000000000..442ab59830c --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash24.C @@ -0,0 +1,11 @@ +// Build don't link: + +template class U> void template_fn (T); +template void callme ( void (*)(T)); + +template struct S1; + +int main() +{ + callme( template_fn); // ERROR - no matching function +}