On Wed, Feb 10, 2021 at 04:48:56PM -0500, Jason Merrill wrote:
> On 2/10/21 12:35 PM, Marek Polacek wrote:
> > Freeing the condition chain needs to use vec_free which does ->release,
> > or we leak memory.
> 
> OK, but if chain were an auto_vec, delete would work.

Yes.

> Can we merge auto_vec with vec now that we're compiling as C++11?

Yeah, that works too, though I like how vec_free also sets its argument
to NULL...  Up to you.

Joseph, are you OK with this version too?

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

Verified that the leaks valgrind detected are gone.

-- >8 --
-Wduplicated-cond uses a simple vec for the condition chain and
it uses delete to destroy the chain, which doesn't call ->release,
resulting in memory leaks.

This patch makes it use auto_vec instead; we'll now call ->release
when deleting the chain.

gcc/c-family/ChangeLog:

        * c-common.h (warn_duplicated_cond_add_or_warn): Use auto_vec
        for the condition chain.
        * c-warn.c (warn_duplicated_cond_add_or_warn): Likewise.

gcc/c/ChangeLog:

        * c-parser.c (c_parser_statement_after_labels): Use auto_vec
        for the condition chain.
        (c_parser_if_statement): Likewise.
        (c_parser_else_body): Likewise.

gcc/cp/ChangeLog:

        * parser.c (cp_parser_statement): Use auto_vec for the condition chain.
        (cp_parser_selection_statement): Likewise.
        (cp_parser_implicitly_scoped_statement): Likewise.
---
 gcc/c-family/c-common.h |  3 ++-
 gcc/c-family/c-warn.c   |  3 ++-
 gcc/c/c-parser.c        | 12 ++++++------
 gcc/cp/parser.c         | 15 ++++++++-------
 4 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index f30b6c6ac33..bc02481a11e 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -1430,7 +1430,8 @@ extern void maybe_record_typedef_use (tree);
 extern void maybe_warn_unused_local_typedefs (void);
 extern void maybe_warn_bool_compare (location_t, enum tree_code, tree, tree);
 extern bool maybe_warn_shift_overflow (location_t, tree, tree);
-extern void warn_duplicated_cond_add_or_warn (location_t, tree, vec<tree> **);
+extern void warn_duplicated_cond_add_or_warn (location_t, tree,
+                                             auto_vec<tree> **);
 extern bool diagnose_mismatched_attributes (tree, tree);
 extern tree do_warn_duplicated_branches_r (tree *, int *, void *);
 extern void warn_for_multistatement_macros (location_t, location_t,
diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c
index e6e28d9b139..ce5d4890181 100644
--- a/gcc/c-family/c-warn.c
+++ b/gcc/c-family/c-warn.c
@@ -2499,7 +2499,8 @@ maybe_warn_unused_local_typedefs (void)
    of COND.  */
 
 void
-warn_duplicated_cond_add_or_warn (location_t loc, tree cond, vec<tree> **chain)
+warn_duplicated_cond_add_or_warn (location_t loc, tree cond,
+                                 auto_vec<tree> **chain)
 {
   /* No chain has been created yet.  Do nothing.  */
   if (*chain == NULL)
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index a8df208493c..0153f0805f8 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -1524,10 +1524,10 @@ static location_t c_parser_compound_statement_nostart 
(c_parser *);
 static void c_parser_label (c_parser *, tree);
 static void c_parser_statement (c_parser *, bool *, location_t * = NULL);
 static void c_parser_statement_after_labels (c_parser *, bool *,
-                                            vec<tree> * = NULL);
+                                            auto_vec<tree> * = nullptr);
 static tree c_parser_c99_block_statement (c_parser *, bool *,
                                          location_t * = NULL);
-static void c_parser_if_statement (c_parser *, bool *, vec<tree> *);
+static void c_parser_if_statement (c_parser *, bool *, auto_vec<tree> *);
 static void c_parser_switch_statement (c_parser *, bool *);
 static void c_parser_while_statement (c_parser *, bool, unsigned short, bool 
*);
 static void c_parser_do_statement (c_parser *, bool, unsigned short);
@@ -6084,7 +6084,7 @@ c_parser_statement (c_parser *parser, bool *if_p, 
location_t *loc_after_labels)
 
 static void
 c_parser_statement_after_labels (c_parser *parser, bool *if_p,
-                                vec<tree> *chain)
+                                auto_vec<tree> *chain)
 {
   location_t loc = c_parser_peek_token (parser)->location;
   tree stmt = NULL_TREE;
@@ -6373,7 +6373,7 @@ c_parser_if_body (c_parser *parser, bool *if_p,
 
 static tree
 c_parser_else_body (c_parser *parser, const token_indent_info &else_tinfo,
-                   vec<tree> *chain)
+                   auto_vec<tree> *chain)
 {
   location_t body_loc = c_parser_peek_token (parser)->location;
   tree block = c_begin_compound_stmt (flag_isoc99);
@@ -6458,7 +6458,7 @@ c_parser_maybe_reclassify_token (c_parser *parser)
    implement -Wparentheses.  */
 
 static void
-c_parser_if_statement (c_parser *parser, bool *if_p, vec<tree> *chain)
+c_parser_if_statement (c_parser *parser, bool *if_p, auto_vec<tree> *chain)
 {
   tree block;
   location_t loc;
@@ -6494,7 +6494,7 @@ c_parser_if_statement (c_parser *parser, bool *if_p, 
vec<tree> *chain)
            {
              /* We've got "if (COND) else if (COND2)".  Start the
                 condition chain and add COND as the first element.  */
-             chain = new vec<tree> ();
+             chain = new auto_vec<tree> ();
              if (!CONSTANT_CLASS_P (cond) && !TREE_SIDE_EFFECTS (cond))
                chain->safe_push (cond);
            }
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 5da8670f0e2..641113d0528 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -2176,7 +2176,8 @@ static void cp_parser_lambda_body
 /* Statements [gram.stmt.stmt]  */
 
 static void cp_parser_statement
-  (cp_parser *, tree, bool, bool *, vec<tree> * = NULL, location_t * = NULL);
+  (cp_parser *, tree, bool, bool *, auto_vec<tree> * = nullptr,
+   location_t * = nullptr);
 static void cp_parser_label_for_labeled_statement
 (cp_parser *, tree);
 static tree cp_parser_expression_statement
@@ -2186,7 +2187,7 @@ static tree cp_parser_compound_statement
 static void cp_parser_statement_seq_opt
   (cp_parser *, tree);
 static tree cp_parser_selection_statement
-  (cp_parser *, bool *, vec<tree> *);
+  (cp_parser *, bool *, auto_vec<tree> *);
 static tree cp_parser_condition
   (cp_parser *);
 static tree cp_parser_iteration_statement
@@ -2211,7 +2212,7 @@ static void cp_parser_declaration_statement
   (cp_parser *);
 
 static tree cp_parser_implicitly_scoped_statement
-  (cp_parser *, bool *, const token_indent_info &, vec<tree> * = NULL);
+  (cp_parser *, bool *, const token_indent_info &, auto_vec<tree> * = nullptr);
 static void cp_parser_already_scoped_statement
   (cp_parser *, bool *, const token_indent_info &);
 
@@ -11565,7 +11566,7 @@ add_debug_begin_stmt (location_t loc)
 
 static void
 cp_parser_statement (cp_parser* parser, tree in_statement_expr,
-                    bool in_compound, bool *if_p, vec<tree> *chain,
+                    bool in_compound, bool *if_p, auto_vec<tree> *chain,
                     location_t *loc_after_labels)
 {
   tree statement, std_attrs = NULL_TREE;
@@ -12186,7 +12187,7 @@ cp_parser_init_statement_p (cp_parser *parser)
 
 static tree
 cp_parser_selection_statement (cp_parser* parser, bool *if_p,
-                              vec<tree> *chain)
+                              auto_vec<tree> *chain)
 {
   cp_token *token;
   enum rid keyword;
@@ -12329,7 +12330,7 @@ cp_parser_selection_statement (cp_parser* parser, bool 
*if_p,
                        /* We've got "if (COND) else if (COND2)".  Start
                           the condition chain and add COND as the first
                           element.  */
-                       chain = new vec<tree> ();
+                       chain = new auto_vec<tree> ();
                        if (!CONSTANT_CLASS_P (condition)
                            && !TREE_SIDE_EFFECTS (condition))
                        {
@@ -13547,7 +13548,7 @@ cp_parser_declaration_statement (cp_parser* parser)
 static tree
 cp_parser_implicitly_scoped_statement (cp_parser* parser, bool *if_p,
                                       const token_indent_info &guard_tinfo,
-                                      vec<tree> *chain)
+                                      auto_vec<tree> *chain)
 {
   tree statement;
   location_t body_loc = cp_lexer_peek_token (parser->lexer)->location;

base-commit: 21c6ad7a12fecc4c85ac26289d9096379b550585
-- 
2.29.2

Reply via email to