ping? On 01/18/2017 01:25 PM, Nathan Sidwell wrote:
Jason, I've figured out what's happening here. Just not sure of the most prudent way to fix it.struct no_destr { no_destr() = default; protected: ~no_destr() = default; }; void *Foo () { return new no_destr (); } no_destr is a type for which the default ctor is not DECL_ARTIFICIAL, but is_trivial is true. type_build_ctor_call returns true because of that. After parsing 'no_destr ()' part of the new expr, we're inside build_new_1, which because it's an explicit_value_init, we end up doing: /* Something like `new int()'. */ tree val = build_value_init (type, complain); build_value_init ends up in build_over_call at: else if (!DECL_DELETED_FN (fn) && trivial_fn_p (fn)) { ... else if (default_ctor_p (fn)) { if (is_dummy_object (argarray[0])) return force_target_expr (DECL_CONTEXT (fn), void_node, complain); and force_target_expr ends up (via build_target_expr) with trying to build a clean up for the object. Poof! We need to tell that force_target_expr to not create a cleanup. Choices are 1) augment tf_subst flags to add such a flag. (somewhat icky, but simple) 2) a new force_target_expr_nocleanup routine, wrapping things appropriately. thoughts? nathan
-- Nathan Sidwell
