------- 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