Fix memory leak in resolve_wiretype().
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc index d6a0a2a..f1b81a9 100644 --- a/systemverilog-plugin/UhdmAst.cc +++ b/systemverilog-plugin/UhdmAst.cc
@@ -495,21 +495,16 @@ } if (wiretype_node == nullptr) return; - std::vector<AST::AstNode *> packed_ranges; - std::vector<AST::AstNode *> unpacked_ranges; - // First check if it has already defined ranges - if (wire_node->attributes.count(UhdmAst::packed_ranges())) { - for (auto r : wire_node->attributes[UhdmAst::packed_ranges()]->children) { - packed_ranges.push_back(r->clone()); - } - } - if (wire_node->attributes.count(UhdmAst::unpacked_ranges())) { - for (auto r : wire_node->attributes[UhdmAst::unpacked_ranges()]->children) { - unpacked_ranges.push_back(r->clone()); - } - } + + unique_resource<std::vector<AST::AstNode *>> packed_ranges = wire_node->attributes.count(attr_id::packed_ranges) + ? std::move(wire_node->attributes[attr_id::packed_ranges]->children) + : std::vector<AST::AstNode *>{}; delete_attribute(wire_node, attr_id::packed_ranges); + unique_resource<std::vector<AST::AstNode *>> unpacked_ranges = wire_node->attributes.count(attr_id::unpacked_ranges) + ? std::move(wire_node->attributes[attr_id::unpacked_ranges]->children) + : std::vector<AST::AstNode *>{}; delete_attribute(wire_node, attr_id::unpacked_ranges); + AST::AstNode *wiretype_ast = nullptr; log_assert(AST_INTERNAL::current_scope.count(wiretype_node->str)); wiretype_ast = AST_INTERNAL::current_scope[wiretype_node->str]; @@ -557,10 +552,10 @@ // add wiretype range before current wire ranges std::reverse(packed_ranges_wiretype.begin(), packed_ranges_wiretype.end()); std::reverse(unpacked_ranges_wiretype.begin(), unpacked_ranges_wiretype.end()); - std::reverse(packed_ranges.begin(), packed_ranges.end()); - std::reverse(unpacked_ranges.begin(), unpacked_ranges.end()); - packed_ranges.insert(packed_ranges.begin(), packed_ranges_wiretype.begin(), packed_ranges_wiretype.end()); - unpacked_ranges.insert(unpacked_ranges.begin(), unpacked_ranges_wiretype.begin(), unpacked_ranges_wiretype.end()); + std::reverse(packed_ranges->begin(), packed_ranges->end()); + std::reverse(unpacked_ranges->begin(), unpacked_ranges->end()); + packed_ranges->insert(packed_ranges->begin(), packed_ranges_wiretype.begin(), packed_ranges_wiretype.end()); + unpacked_ranges->insert(unpacked_ranges->begin(), unpacked_ranges_wiretype.begin(), unpacked_ranges_wiretype.end()); AST::AstNode *value = nullptr; if (wire_node->children[0]->type != AST::AST_RANGE) { value = wire_node->children[0]->clone(); @@ -568,7 +563,7 @@ delete_children(wire_node); if (value) wire_node->children.push_back(value); - add_multirange_wire(wire_node, packed_ranges, unpacked_ranges, false /* reverse */); + add_multirange_wire(wire_node, packed_ranges.release(), unpacked_ranges.release(), false /* reverse */); } }