Hi, On Tue, May 15 2018, Jason Merrill wrote: > In C++11 and up, the implicitly-declared copy constructor and > assignment operator are deprecated if one of them, or the destructor, > is user-provided. Implementing that in G++ turned up a few dodgy uses > in the compiler. > > In general it's unsafe to copy an ipa_edge_args, because if one of the > pointers is non-null you get two copies of a vec pointer, and when one > of the objects is destroyed it frees the vec and leaves the other > object pointing to freed memory. This specific example is safe > because it only copies from an object with null pointers, but it would > be better to avoid the copy. OK for trunk?
I have had a look and found out that the function in question (ipa_free_edge_args_substructures) has no uses, apparently I forgot to remove it when I did the conversion of jump functions to be stored in call graph edge summaries. So thanks lot for spotting this but I'd prefer the following (compiled but untested) patch: Martin 2018-05-16 Martin Jambor <mjam...@suse.cz> * ipa-prop.c (ipa_free_all_edge_args): Remove. * ipa-prop.h (ipa_free_all_edge_args): Likewise. diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 38441cc49bc..19d55cda009 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -3708,16 +3708,6 @@ ipa_check_create_edge_args (void) ipa_vr_hash_table = hash_table<ipa_vr_ggc_hash_traits>::create_ggc (37); } -/* Frees all dynamically allocated structures that the argument info points - to. */ - -void -ipa_free_edge_args_substructures (struct ipa_edge_args *args) -{ - vec_free (args->jump_functions); - *args = ipa_edge_args (); -} - /* Free all ipa_edge structures. */ void diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h index a61e06135e3..dc45cea9c71 100644 --- a/gcc/ipa-prop.h +++ b/gcc/ipa-prop.h @@ -664,7 +664,6 @@ extern GTY(()) vec<ipcp_transformation_summary, va_gc> *ipcp_transformations; void ipa_create_all_node_params (void); void ipa_create_all_edge_args (void); void ipa_check_create_edge_args (void); -void ipa_free_edge_args_substructures (struct ipa_edge_args *); void ipa_free_all_node_params (void); void ipa_free_all_edge_args (void); void ipa_free_all_structures_after_ipa_cp (void);