re PR c++/48481 (C++ overloading memory hog)
authorJason Merrill <jason@redhat.com>
Fri, 8 Apr 2011 06:08:04 +0000 (02:08 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 8 Apr 2011 06:08:04 +0000 (02:08 -0400)
PR c++/48481
* call.c (build_user_type_conversion_1): Use lookup_fnfields_slot.
Release unused vector.

From-SVN: r172162

gcc/cp/ChangeLog
gcc/cp/call.c

index fcb5232af729f0ec60e97606d76661e7cdaf68e5..2cb394f00e6105b180a806c1247aa4ad4e2f13b6 100644 (file)
@@ -1,5 +1,9 @@
 2011-04-07  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48481
+       * call.c (build_user_type_conversion_1): Use lookup_fnfields_slot.
+       Release unused vector.
+
        PR c++/48451
        * pt.c (fn_type_unification): Don't clear incomplete pack flag.
        (type_unification_real): Clear it here instead.
index f283bd116609fd76d7aa77eb9227c2964746d42d..096fbbc3d9c4998ae8f26a057db9cc5656123d66 100644 (file)
@@ -3249,7 +3249,9 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
              || !DERIVED_FROM_P (totype, fromtype));
 
   if (MAYBE_CLASS_TYPE_P (totype))
-    ctors = lookup_fnfields (totype, complete_ctor_identifier, 0);
+    /* Use lookup_fnfields_slot instead of lookup_fnfields to avoid
+       creating a garbage BASELINK; constructors can't be inherited.  */
+    ctors = lookup_fnfields_slot (totype, complete_ctor_identifier);
 
   if (MAYBE_CLASS_TYPE_P (fromtype))
     {
@@ -3281,7 +3283,6 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
   if (ctors)
     {
       int ctorflags = flags;
-      ctors = BASELINK_FUNCTIONS (ctors);
 
       first_arg = build_int_cst (build_pointer_type (totype), 0);
 
@@ -3389,7 +3390,11 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
 
   candidates = splice_viable (candidates, pedantic, &any_viable_p);
   if (!any_viable_p)
-    return NULL;
+    {
+      if (args)
+       release_tree_vector (args);
+      return NULL;
+    }
 
   cand = tourney (candidates);
   if (cand == 0)