In gcc/cp/error.c we initialize the C++ pretty printer object twice:
first during statics initialization and later in a placement-new in
init_error().  This double-initialization causes a memory leak of about
7kb according to valgrind.  I don't see a reason to initialize the
object a second time so I elected to remove init_error().

Does the patch look OK after testing?

gcc/cp/ChangeLog:

        * cp-tree.h (init_error): Remove declaration.
        * error.c (scratch_pretty_printer): Rename to ...
        (actual_pretty_printer): ... this.
        (cxx_pp): Constify and update accordingly.
        (init_error): Remove definition.
        * lex.c (cxx_init): Do not call init_error.
---
 gcc/cp/cp-tree.h |  1 -
 gcc/cp/error.c   | 14 ++------------
 gcc/cp/lex.c     |  1 -
 3 files changed, 2 insertions(+), 14 deletions(-)

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 4136d98..c51f88f 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -5505,7 +5505,6 @@ extern tree 
vtv_finish_verification_constructor_init_function (tree);
 extern bool cp_omp_mappable_type               (tree);
 
 /* in error.c */
-extern void init_error                         (void);
 extern const char *type_as_string              (tree, int);
 extern const char *type_as_string_translate    (tree, int);
 extern const char *decl_as_string              (tree, int);
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index ce43f86..0d98a3c 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -54,8 +54,8 @@ along with GCC; see the file COPYING3.  If not see
    tree -> string functions that are occasionally called from the
    debugger or by the front-end for things like
    __PRETTY_FUNCTION__.  */
-static cxx_pretty_printer scratch_pretty_printer;
-static cxx_pretty_printer * cxx_pp = &scratch_pretty_printer;
+static cxx_pretty_printer actual_pretty_printer;
+static cxx_pretty_printer * const cxx_pp = &actual_pretty_printer;
 
 /* Translate if being used for diagnostics, but not for dump files or
    __PRETTY_FUNCTION.  */
@@ -140,16 +140,6 @@ cxx_initialize_diagnostics (diagnostic_context *context)
   diagnostic_format_decoder (context) = cp_printer;
 }
 
-/* Initialize the global cxx_pp that is used as the memory store for
-   the string representation of C++ AST.  See the description of
-   cxx_pp above.  */
-
-void
-init_error (void)
-{
-  new (cxx_pp) cxx_pretty_printer ();
-}
-
 /* Dump a scope, if deemed necessary.  */
 
 static void
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 0fced4f..bde15bc 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -259,7 +259,6 @@ cxx_init (void)
   init_cp_semantics ();
   init_operators ();
   init_method ();
-  init_error ();
 
   current_function_decl = NULL;
 
-- 
2.4.0.rc2.31.g7c597ef

Reply via email to