Commit 4db15d75 by Jan Hubicka Committed by Jan Hubicka

re PR tree-optimization/37345 (Segfault in decl_function_context (TYPE_MAIN_VARIANT))

	PR tree-optimization/37345
	PR tree-optimization/37358
	PR tree-optimization/37357
	* 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.

From-SVN: r139980
parent 28e6bb13
2008-09-04 Jan Hubicka <jh@suse.cz>
PR tree-optimization/37345
PR tree-optimization/37358
PR tree-optimization/37357
* 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.
2008-09-04 Nick Clifton <nickc@redhat.com> 2008-09-04 Nick Clifton <nickc@redhat.com>
* configure.ac (HAVE_GAS_LCOMM_WITH_ALIGNMENT): New assembler * configure.ac (HAVE_GAS_LCOMM_WITH_ALIGNMENT): New assembler
......
2008-09-03 Jan Hubicka <jh@suse.cz>
PR tree-optimization/37345
PR tree-optimization/37358
PR tree-optimization/37357
* g++.dg/torture/pr37345.c: New file.
2008-09-03 Tobias Grosser <grosser@fim.uni-passau.de> 2008-09-03 Tobias Grosser <grosser@fim.uni-passau.de>
* lib/target-supports.exp (check_effective_target_fgraphite): Fix test. * lib/target-supports.exp (check_effective_target_fgraphite): Fix test.
......
/* { dg-do compile } */
class EbmlElement {
virtual EbmlElement * Clone() const;
};
class KaxTracks : public EbmlElement {
public:
EbmlElement * Clone() const {
return new KaxTracks(*this);
}
};
KaxTracks kax_tracks;
void finish_file(void)
{
kax_tracks.Clone();
}
...@@ -5925,7 +5925,12 @@ build_function_type_skip_args (tree orig_type, bitmap args_to_skip) ...@@ -5925,7 +5925,12 @@ build_function_type_skip_args (tree orig_type, bitmap args_to_skip)
TYPE_ARG_TYPES (new_type) = new_reversed; TYPE_ARG_TYPES (new_type) = new_reversed;
} }
else 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 /* 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. */ variants. We can handle everything except the main variant lazily. */
...@@ -5959,7 +5964,12 @@ build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip) ...@@ -5959,7 +5964,12 @@ build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip)
new_type = TREE_TYPE (orig_decl); new_type = TREE_TYPE (orig_decl);
if (prototype_p (new_type)) if (prototype_p (new_type))
new_type = build_function_type_skip_args (new_type, args_to_skip); 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; return new_decl;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment