https://gcc.gnu.org/g:ae4f4f767efc156aac4b2e7a874648fdc60307f3
commit r15-2286-gae4f4f767efc156aac4b2e7a874648fdc60307f3 Author: David Malcolm <dmalc...@redhat.com> Date: Wed Jul 24 18:07:54 2024 -0400 diagnostics: JSON output: use std::unique_ptr throughout No functional change intended. gcc/ChangeLog: * diagnostic-format-json.cc: Include "make-unique.h". (json_output_format::m_toplevel_array): Convert to std::unique_ptr. (json_output_format::json_output_format): Update accordingly. (json_output_format::~json_output_format): Remove manual "delete" of field. (json_from_expanded_location): Convert return type to std::unique_ptr. (json_from_location_range): Likewise. Use nullptr rather than NULL. (json_from_fixit_hint): Convert return type to std::unique_ptr. (json_from_metadata): Likewise. (make_json_for_path): Likewise. (json_output_format::on_end_diagnostic): Use std::unique_ptr throughout. (json_file_output_format::~json_file_output_format): Use nullptr. (selftest::test_unknown_location): Update to use std::unique_ptr. (selftest::test_bad_endpoints): Likewise. Replace NULL with nullptr. Signed-off-by: David Malcolm <dmalc...@redhat.com> Diff: --- gcc/diagnostic-format-json.cc | 122 +++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/gcc/diagnostic-format-json.cc b/gcc/diagnostic-format-json.cc index 55ba39e0c532..b78cb92cfd7a 100644 --- a/gcc/diagnostic-format-json.cc +++ b/gcc/diagnostic-format-json.cc @@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see #include "json.h" #include "selftest.h" #include "logical-location.h" +#include "make-unique.h" /* Subclass of diagnostic_output_format for JSON output. */ @@ -62,7 +63,7 @@ protected: json_output_format (diagnostic_context &context, bool formatted) : diagnostic_output_format (context), - m_toplevel_array (new json::array ()), + m_toplevel_array (::make_unique<json::array> ()), m_cur_group (nullptr), m_cur_children_array (nullptr), m_formatted (formatted) @@ -75,31 +76,30 @@ protected: { m_toplevel_array->dump (outf, m_formatted); fprintf (outf, "\n"); - delete m_toplevel_array; m_toplevel_array = nullptr; } private: /* The top-level JSON array of pending diagnostics. */ - json::array *m_toplevel_array; + std::unique_ptr<json::array> m_toplevel_array; /* The JSON object for the current diagnostic group. */ - json::object *m_cur_group; + json::object *m_cur_group; // borrowed /* The JSON array for the "children" array within the current diagnostic group. */ - json::array *m_cur_children_array; + json::array *m_cur_children_array; // borrowed bool m_formatted; }; /* Generate a JSON object for LOC. */ -static json::value * +static std::unique_ptr<json::object> json_from_expanded_location (diagnostic_context &context, location_t loc) { expanded_location exploc = expand_location (loc); - json::object *result = new json::object (); + std::unique_ptr<json::object> result = ::make_unique <json::object> (); if (exploc.file) result->set_string ("file", exploc.file); result->set_integer ("line", exploc.line); @@ -130,26 +130,29 @@ json_from_expanded_location (diagnostic_context &context, location_t loc) /* Generate a JSON object for LOC_RANGE. */ -static json::object * +static std::unique_ptr<json::object> json_from_location_range (diagnostic_context &context, const location_range *loc_range, unsigned range_idx) { location_t caret_loc = get_pure_location (loc_range->m_loc); if (caret_loc == UNKNOWN_LOCATION) - return NULL; + return nullptr; location_t start_loc = get_start (loc_range->m_loc); location_t finish_loc = get_finish (loc_range->m_loc); - json::object *result = new json::object (); - result->set ("caret", json_from_expanded_location (context, caret_loc)); + std::unique_ptr<json::object> result = ::make_unique <json::object> (); + result->set ("caret", + json_from_expanded_location (context, caret_loc)); if (start_loc != caret_loc && start_loc != UNKNOWN_LOCATION) - result->set ("start", json_from_expanded_location (context, start_loc)); + result->set ("start", + json_from_expanded_location (context, start_loc)); if (finish_loc != caret_loc && finish_loc != UNKNOWN_LOCATION) - result->set ("finish", json_from_expanded_location (context, finish_loc)); + result->set ("finish", + json_from_expanded_location (context, finish_loc)); if (loc_range->m_label) { @@ -163,15 +166,17 @@ json_from_location_range (diagnostic_context &context, /* Generate a JSON object for HINT. */ -static json::object * +static std::unique_ptr<json::object> json_from_fixit_hint (diagnostic_context &context, const fixit_hint *hint) { - json::object *fixit_obj = new json::object (); + std::unique_ptr<json::object> fixit_obj = ::make_unique <json::object> (); location_t start_loc = hint->get_start_loc (); - fixit_obj->set ("start", json_from_expanded_location (context, start_loc)); + fixit_obj->set ("start", + json_from_expanded_location (context, start_loc)); location_t next_loc = hint->get_next_loc (); - fixit_obj->set ("next", json_from_expanded_location (context, next_loc)); + fixit_obj->set ("next", + json_from_expanded_location (context, next_loc). release ()); fixit_obj->set_string ("string", hint->get_string ()); return fixit_obj; @@ -179,10 +184,10 @@ json_from_fixit_hint (diagnostic_context &context, const fixit_hint *hint) /* Generate a JSON object for METADATA. */ -static json::object * +static std::unique_ptr<json::object> json_from_metadata (const diagnostic_metadata *metadata) { - json::object *metadata_obj = new json::object (); + std::unique_ptr<json::object> metadata_obj = ::make_unique <json::object> (); if (metadata->get_cwe ()) metadata_obj->set_integer ("cwe", metadata->get_cwe ()); @@ -192,16 +197,16 @@ json_from_metadata (const diagnostic_metadata *metadata) /* Make a JSON value for PATH. */ -static json::value * +static std::unique_ptr<json::array> make_json_for_path (diagnostic_context &context, const diagnostic_path *path) { - json::array *path_array = new json::array (); + std::unique_ptr<json::array> path_array = ::make_unique<json::array> (); for (unsigned i = 0; i < path->num_events (); i++) { const diagnostic_event &event = path->get_event (i); - json::object *event_obj = new json::object (); + std::unique_ptr<json::object> event_obj = ::make_unique <json::object> (); if (event.get_location ()) event_obj->set ("location", json_from_expanded_location (context, @@ -214,7 +219,7 @@ make_json_for_path (diagnostic_context &context, event_obj->set_string ("function", name.get ()); } event_obj->set_integer ("depth", event.get_stack_depth ()); - path_array->append (event_obj); + path_array->append (std::move (event_obj)); } return path_array; } @@ -273,37 +278,41 @@ json_output_format::on_end_diagnostic (const diagnostic_info &diagnostic, { /* Otherwise, make diag_obj be the top-level object within the group; add a "children" array and record the column origin. */ - m_toplevel_array->append (diag_obj); m_cur_group = diag_obj; - m_cur_children_array = new json::array (); - diag_obj->set ("children", m_cur_children_array); + std::unique_ptr<json::array> children_array + = ::make_unique<json::array> (); + m_cur_children_array = children_array.get (); // borrowed + diag_obj->set ("children", std::move (children_array)); diag_obj->set_integer ("column-origin", m_context.m_column_origin); + m_toplevel_array->append (diag_obj); } - const rich_location *richloc = diagnostic.richloc; + /* diag_obj is now owned by either m_cur_children_array or + m_toplevel_array; further uses of diag_obj are borrowing it. */ - json::array *loc_array = new json::array (); - diag_obj->set ("locations", loc_array); + const rich_location *richloc = diagnostic.richloc; - for (unsigned int i = 0; i < richloc->get_num_locations (); i++) - { - const location_range *loc_range = richloc->get_range (i); - json::object *loc_obj - = json_from_location_range (m_context, loc_range, i); - if (loc_obj) - loc_array->append (loc_obj); - } + { + std::unique_ptr<json::array> loc_array = ::make_unique<json::array> (); + for (unsigned int i = 0; i < richloc->get_num_locations (); i++) + { + const location_range *loc_range = richloc->get_range (i); + if (std::unique_ptr<json::object> loc_obj + = json_from_location_range (m_context, loc_range, i)) + loc_array->append (std::move (loc_obj)); + } + diag_obj->set ("locations", std::move (loc_array)); + } if (richloc->get_num_fixit_hints ()) { - json::array *fixit_array = new json::array (); - diag_obj->set ("fixits", fixit_array); + std::unique_ptr<json::array> fixit_array = ::make_unique<json::array> (); for (unsigned int i = 0; i < richloc->get_num_fixit_hints (); i++) { const fixit_hint *hint = richloc->get_fixit_hint (i); - json::object *fixit_obj = json_from_fixit_hint (m_context, hint); - fixit_array->append (fixit_obj); + fixit_array->append (json_from_fixit_hint (m_context, hint)); } + diag_obj->set ("fixits", std::move (fixit_array)); } /* TODO: tree-ish things: @@ -312,20 +321,13 @@ json_output_format::on_end_diagnostic (const diagnostic_info &diagnostic, TODO: macro expansion information. */ if (diagnostic.metadata) - { - json::object *metadata_obj = json_from_metadata (diagnostic.metadata); - diag_obj->set ("metadata", metadata_obj); - } + diag_obj->set ("metadata", json_from_metadata (diagnostic.metadata)); const diagnostic_path *path = richloc->get_path (); if (path) - { - json::value *path_value = make_json_for_path (m_context, path); - diag_obj->set ("path", path_value); - } + diag_obj->set ("path", make_json_for_path (m_context, path)); - diag_obj->set ("escape-source", - new json::literal (richloc->escape_on_output_p ())); + diag_obj->set_bool ("escape-source", richloc->escape_on_output_p ()); } class json_stderr_output_format : public json_output_format @@ -359,7 +361,7 @@ public: ~json_file_output_format () { - char *filename = concat (m_base_file_name, ".gcc.json", NULL); + char *filename = concat (m_base_file_name, ".gcc.json", nullptr); free (m_base_file_name); m_base_file_name = nullptr; FILE *outf = fopen (filename, "w"); @@ -441,7 +443,7 @@ static void test_unknown_location () { test_diagnostic_context dc; - delete json_from_expanded_location (dc, UNKNOWN_LOCATION); + json_from_expanded_location (dc, UNKNOWN_LOCATION); } /* Verify that we gracefully handle attempts to serialize bad @@ -457,16 +459,16 @@ test_bad_endpoints () location_range loc_range; loc_range.m_loc = bad_endpoints; loc_range.m_range_display_kind = SHOW_RANGE_WITH_CARET; - loc_range.m_label = NULL; + loc_range.m_label = nullptr; test_diagnostic_context dc; - json::object *obj = json_from_location_range (dc, &loc_range, 0); + std::unique_ptr<json::object> obj + = json_from_location_range (dc, &loc_range, 0); /* We should have a "caret" value, but no "start" or "finish" values. */ - ASSERT_TRUE (obj != NULL); - ASSERT_TRUE (obj->get ("caret") != NULL); - ASSERT_TRUE (obj->get ("start") == NULL); - ASSERT_TRUE (obj->get ("finish") == NULL); - delete obj; + ASSERT_TRUE (obj != nullptr); + ASSERT_TRUE (obj->get ("caret") != nullptr); + ASSERT_TRUE (obj->get ("start") == nullptr); + ASSERT_TRUE (obj->get ("finish") == nullptr); } /* Run all of the selftests within this file. */