decl2.c (add_function): Reorganize.
authorTheodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
Sat, 12 Aug 2000 01:30:06 +0000 (03:30 +0200)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 12 Aug 2000 01:30:06 +0000 (21:30 -0400)
        * decl2.c (add_function): Reorganize.
        (arg_assoc): Do not consider function template decls.

From-SVN: r35653

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

index 27126a5b297ce49665b71dff4812a97bec820108..82ceceb9c0439caac44aa6ee8f83ba5539add2a5 100644 (file)
@@ -1,3 +1,8 @@
+2000-08-11  Theodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
+
+       * decl2.c (add_function): Reorganize.
+       (arg_assoc): Do not consider function template decls.
+
 2000-08-11  Jason Merrill  <jason@redhat.com>
 
        * decl.c (lookup_name_real): Don't forget the TYPENAME_TYPE we're
index 7422be17761039ea4fa8328c331cfca3ca257141..7bdd34c0008a799387062702a7147c5b8d801ae9 100644 (file)
@@ -4791,10 +4791,11 @@ add_function (k, fn)
      case.  */
 
   /* We must find only functions, or exactly one non-function. */
-  if (k->functions && is_overloaded_fn (k->functions)
-      && is_overloaded_fn (fn))
+  if (!k->functions) 
+    k->functions = fn;
+  else if (is_overloaded_fn (k->functions) && is_overloaded_fn (fn))
     k->functions = build_overload (fn, k->functions);
-  else if (k->functions)
+  else
     {
       tree f1 = OVL_CURRENT (k->functions);
       tree f2 = fn;
@@ -4807,8 +4808,7 @@ add_function (k, fn)
       cp_error ("  in call to `%D'", k->name);
       return 1;
     }
-  else
-    k->functions = fn;
+
   return 0;
 }
 
@@ -5063,9 +5063,15 @@ arg_assoc (k, n)
     {
       my_friendly_assert (TREE_CODE (n) == OVERLOAD, 980715);
       
-      for (; n; n = OVL_CHAIN (n))
-       if (arg_assoc_type (k, TREE_TYPE (OVL_FUNCTION (n))))
-         return 1;
+      for (; n; n = OVL_CHAIN (n)) 
+        {
+          /* Do not consider function template decls during Koenig lookup.  */
+
+          tree fn = OVL_FUNCTION (n);
+         if (!DECL_FUNCTION_TEMPLATE_P (fn)
+              && arg_assoc_type (k, TREE_TYPE (fn)))
+           return 1;
+        }
     }
 
   return 0;
diff --git a/gcc/testsuite/g++.old-deja/g++.ns/koenig9.C b/gcc/testsuite/g++.old-deja/g++.ns/koenig9.C
new file mode 100644 (file)
index 0000000..b8014a5
--- /dev/null
@@ -0,0 +1,13 @@
+// Build don't link:
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo 23 Jun 2000 <Theodore.Papadopoulo@sophia.inria.fr>
+
+#include <algorithm>
+
+void foo(const char*,...);
+
+inline void
+bar() {
+  foo("",count);    //  ERROR - multiple overloaded count functions
+}