aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@markmitchell.com>1998-09-01 09:56:40 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1998-09-01 09:56:40 +0000
commit0c8bfdbc0cf0ef6644da218eeb1e816f952f963f (patch)
tree4991749b846f4c80e4d6b174c3357b1c436bc8d3 /gcc
parent99d7f99a7feb8aba91a4fdf61c820317fd425b57 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/cp/decl2.c68
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash24.C11
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
+}