On Thu, Aug 22, 2013 at 05:27:54AM -0500, Gabriel Dos Reis wrote: > * error.c (init_error): Remove calls to pp_construct and > pp_cxx_pretty_printer_init. Initialize cxx_pp with placement-new. > * cxx-pretty-print.h (cxx_pretty_printer::cxx_pretty_printer): Declare. > (cxx_pretty_printer_init): Remove. > * cxx-pretty-print.c (cxx_pretty_printer::cxx_pretty_printer): > Rename from cxx_pretty_printer_init. Adjust. > * cp-objcp-common.c (cxx_initialize_diagnostics): Simplify > initialization of C++ diagnostics pretty printer.
> --- cp/error.c (revision 201904) > +++ cp/error.c (working copy) > @@ -33,6 +33,8 @@ > #include "pointer-set.h" > #include "c-family/c-objc.h" > > +#include <new> // For placement-new. > + > #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',') > #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';') > > @@ -109,8 +111,7 @@ > diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer; > diagnostic_format_decoder (global_dc) = cp_printer; > > - pp_construct (cxx_pp, NULL, 0); > - pp_cxx_pretty_printer_init (cxx_pp); > + new (cxx_pp) cxx_pretty_printer (); Unfortunately this always leaks memory, static cxx_pretty_printer scratch_pretty_printer; is constructed first during static initialization, where it e.g. allocates through XNEW the buffer, and then when init_error is called, it ignores the old content of scratch_pretty_printer and constructs the same objects again. Why is the new (cxx_pp) cxx_pretty_printer (); line needed at all? Isn't it already constructed with the right ctor? Or, shouldn't it at least first try to call destructor? I think there are more spots with placement new, perhaps all have the same issue? Jakub