On 01/23/2012 11:59 AM, Jason Merrill wrote:
The problem in this case was that a few places in the compiler were
assuming that when we have an OVERLOAD, all the functions within it come
from the same context. But that isn't the case when we have
using-declarations involved, so we need to take them into account.

Here's an associated representation change that I held back until stage 1.

Tested x86_64-pc-linux-gnu, applying to trunk.

commit 98637c44e8829792172581d449b3835588dc5563
Author: Jason Merrill <ja...@redhat.com>
Date:   Mon Jan 23 11:06:38 2012 -0500

    	* class.c (add_method): Always build an OVERLOAD for using-decls.
    	* search.c (lookup_member): Handle getting an OVERLOAD for a
    	single function.

diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 5d834d9..6ed4cde 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -1117,9 +1117,13 @@ add_method (tree type, tree method, tree using_decl)
     return false;
 
   /* Add the new binding.  */
-  overload = build_overload (method, current_fns);
-  if (using_decl && TREE_CODE (overload) == OVERLOAD)
-    OVL_USED (overload) = true;
+  if (using_decl)
+    {
+      overload = ovl_cons (method, current_fns);
+      OVL_USED (overload) = true;
+    }
+  else
+    overload = build_overload (method, current_fns);
 
   if (conv_p)
     TYPE_HAS_CONVERSION (type) = 1;
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index e48dcec..a1f8a3d 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1250,10 +1250,12 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type,
     only the first call to "f" is valid.  However, if the function is
     static, we can check.  */
   if (rval && protect 
-      && !really_overloaded_fn (rval)
-      && !(TREE_CODE (rval) == FUNCTION_DECL
-	   && DECL_NONSTATIC_MEMBER_FUNCTION_P (rval)))
-    perform_or_defer_access_check (basetype_path, rval, rval);
+      && !really_overloaded_fn (rval))
+    {
+      tree decl = is_overloaded_fn (rval) ? get_first_fn (rval) : rval;
+      if (!DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+	perform_or_defer_access_check (basetype_path, decl, decl);
+    }
 
   if (errstr && protect)
     {

Reply via email to