diff options
author | Mark Mitchell <mark@markmitchell.com> | 1998-09-01 09:56:40 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1998-09-01 09:56:40 +0000 |
commit | 0c8bfdbc0cf0ef6644da218eeb1e816f952f963f (patch) | |
tree | 4991749b846f4c80e4d6b174c3357b1c436bc8d3 /gcc | |
parent | 99d7f99a7feb8aba91a4fdf61c820317fd425b57 (diff) | |
download | gcc-0c8bfdbc0cf0ef6644da218eeb1e816f952f963f.zip gcc-0c8bfdbc0cf0ef6644da218eeb1e816f952f963f.tar.gz gcc-0c8bfdbc0cf0ef6644da218eeb1e816f952f963f.tar.bz2 |
* decl2.c (arg_assoc): Handle template-id expressions as arguments.
From-SVN: r22156
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 68 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/crash24.C | 11 |
3 files changed, 79 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4e17539..37c16b3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 04424bf..7d54dec 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] + + 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; - for (; n; n = TREE_CHAIN (n)) - if (arg_assoc (k, OVL_FUNCTION (n))) - 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 0000000..442ab59 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash24.C @@ -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 +} |