------- Comment #5 from hubicka at ucw dot cz  2008-09-03 18:33 -------
Subject: Re:  [4.4 Regression] Segfault in decl_function_context
(TYPE_MAIN_VARIANT)

Testing:

        * tree.c (build_function_type_skip_args): Build distinct type copy;
        set TYPE_CONTEXT.
        (build_function_decl_skip_args): Set type of new decl not orig decl;
        clear DECL_VINDEX for methods turned into functions.

Index: tree.c
===================================================================
--- tree.c      (revision 139938)
+++ tree.c      (working copy)
@@ -5925,7 +5925,12 @@ build_function_type_skip_args (tree orig
       TYPE_ARG_TYPES (new_type) = new_reversed;
     }
   else
-    new_type = build_function_type (TREE_TYPE (orig_type), new_reversed);
+    {
+      new_type
+        = build_distinct_type_copy (build_function_type (TREE_TYPE
(orig_type),
+                                                        new_reversed));
+      TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
+    }

   /* This is a new type, not a copy of an old type.  Need to reassociate
      variants.  We can handle everything except the main variant lazily.  */
@@ -5959,7 +5964,12 @@ build_function_decl_skip_args (tree orig
   new_type = TREE_TYPE (orig_decl);
   if (prototype_p (new_type))
     new_type = build_function_type_skip_args (new_type, args_to_skip);
-  TREE_TYPE (orig_decl) = new_type;
+  TREE_TYPE (new_decl) = new_type;
+
+  /* For declarations setting DECL_VINDEX (i.e. methods)
+     we expect first argument to be THIS pointer.   */
+  if (bitmap_bit_p (args_to_skip, 0))
+    DECL_VINDEX (new_decl) = NULL_TREE;
   return new_decl;
 }



-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37345

Reply via email to