Patchwork C++ PATCH for c++/51925 (ICE with using in template)

login
register
mail settings
Submitter Jason Merrill
Date March 4, 2012, 12:55 a.m.
Message ID <4F52BD83.6010908@redhat.com>
Download mbox | patch
Permalink /patch/144471/
State New
Headers show

Comments

Jason Merrill - March 4, 2012, 12:55 a.m.
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.

Patch

commit 98637c44e8829792172581d449b3835588dc5563
Author: Jason Merrill <jason@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)
     {