OSDN Git Service

* decl2.c (arg_assoc): Handle template-id expressions as arguments.
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Sep 1998 09:56:40 +0000 (09:56 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Sep 1998 09:56:40 +0000 (09:56 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@22156 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/g++.old-deja/g++.pt/crash24.C [new file with mode: 0644]

index 4e17539..37c16b3 100644 (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
index 04424bf..7d54dec 100644 (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]
+
+        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 (file)
index 0000000..442ab59
--- /dev/null
@@ -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
+}