[pushed:,r15-4858] analyzer: use std::unique_ptr in "to_json" functions

Message ID 20241102014417.2543591-1-dmalcolm@redhat.com
State Committed
Commit 0cb6078ca83f545bfe54b4064181dca6f81ce45d
Headers
Series [pushed:,r15-4858] analyzer: use std::unique_ptr in "to_json" functions |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply

Commit Message

David Malcolm Nov. 2, 2024, 1:44 a.m. UTC
  No functional change intended.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r15-4858-g0cb6078ca83f54.

gcc/analyzer/ChangeLog:
	* analyzer.cc: Include "make-unique.h".  Convert "to_json"
	functions to use std::unique_ptr.
	* call-string.cc: Likewise.
	* constraint-manager.cc: Likewise.
	* diagnostic-manager.cc: Likewise.
	* engine.cc: Likewise.
	* program-point.cc: Likewise.
	* program-state.cc: Likewise.
	* ranges.cc: Likewise.
	* region-model.cc: Likewise.
	* region.cc: Likewise.
	* svalue.cc: Likewise.
	* sm.cc: Likewise.
	* store.cc: Likewise.
	* supergraph.cc: Likewise.
	* analyzer.h: Convert "to_json" functions to return
	std::unique_ptr.
	* call-string.h: Likewise.
	* constraint-manager.h: Likewise.
	(bounded_range::set_json_attr): Pass "obj" by reference.
	* diagnostic-manager.h: Convert "to_json" functions to return
	std::unique_ptr.
	* exploded-graph.h: Likewise.
	* program-point.h: Likewise.
	* program-state.h: Likewise.
	* ranges.h: Likewise.
	* region-model.h: Likewise.
	* region.h: Likewise.
	* sm.h: Likewise.
	* store.h: Likewise.
	* supergraph.h: Likewise.
	* svalue.h: Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
---
 gcc/analyzer/analyzer.cc           | 21 +++++++------
 gcc/analyzer/analyzer.h            |  8 ++---
 gcc/analyzer/call-string.cc        |  9 +++---
 gcc/analyzer/call-string.h         |  2 +-
 gcc/analyzer/constraint-manager.cc | 49 +++++++++++++++---------------
 gcc/analyzer/constraint-manager.h  | 14 ++++-----
 gcc/analyzer/diagnostic-manager.cc | 12 ++++----
 gcc/analyzer/diagnostic-manager.h  |  4 +--
 gcc/analyzer/engine.cc             | 32 +++++++++----------
 gcc/analyzer/exploded-graph.h      | 10 +++---
 gcc/analyzer/program-point.cc      |  5 +--
 gcc/analyzer/program-point.h       |  2 +-
 gcc/analyzer/program-state.cc      | 21 +++++++------
 gcc/analyzer/program-state.h       |  7 +++--
 gcc/analyzer/ranges.cc             |  7 +++--
 gcc/analyzer/ranges.h              |  4 +--
 gcc/analyzer/region-model.cc       |  8 ++---
 gcc/analyzer/region-model.h        |  4 +--
 gcc/analyzer/region.cc             |  5 +--
 gcc/analyzer/region.h              |  2 +-
 gcc/analyzer/sm.cc                 | 13 ++++----
 gcc/analyzer/sm.h                  |  4 +--
 gcc/analyzer/store.cc              | 26 ++++++++--------
 gcc/analyzer/store.h               | 10 +++---
 gcc/analyzer/supergraph.cc         | 21 +++++++------
 gcc/analyzer/supergraph.h          |  6 ++--
 gcc/analyzer/svalue.cc             |  4 +--
 gcc/analyzer/svalue.h              |  2 +-
 28 files changed, 161 insertions(+), 151 deletions(-)
  

Patch

diff --git a/gcc/analyzer/analyzer.cc b/gcc/analyzer/analyzer.cc
index 0f998e3f66f7..f77dcd76c5cd 100644
--- a/gcc/analyzer/analyzer.cc
+++ b/gcc/analyzer/analyzer.cc
@@ -32,6 +32,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "tree-pretty-print.h"
 #include "diagnostic-event-id.h"
 #include "tree-dfa.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -223,15 +224,15 @@  get_diagnostic_tree_for_gassign (const gassign *assign_stmt)
    This is intended for debugging the analyzer rather than serialization and
    thus is a string (or null, for NULL_TREE).  */
 
-json::value *
+std::unique_ptr<json::value>
 tree_to_json (tree node)
 {
   if (!node)
-    return new json::literal (json::JSON_NULL);
+    return ::make_unique<json::literal> (json::JSON_NULL);
 
   pretty_printer pp;
   dump_generic_node (&pp, node, 0, TDF_VOPS|TDF_MEMSYMS, false);
-  return new json::string (pp_formatted_text (&pp));
+  return ::make_unique<json::string> (pp_formatted_text (&pp));
 }
 
 /* Generate a JSON value for EVENT_ID.
@@ -239,41 +240,41 @@  tree_to_json (tree node)
    thus is a string matching those seen in event messags (or null,
    for unknown).  */
 
-json::value *
+std::unique_ptr<json::value>
 diagnostic_event_id_to_json (const diagnostic_event_id_t &event_id)
 {
   if (event_id.known_p ())
     {
       pretty_printer pp;
       pp_printf (&pp, "%@", &event_id);
-      return new json::string (pp_formatted_text (&pp));
+      return ::make_unique<json::string> (pp_formatted_text (&pp));
     }
   else
-    return new json::literal (json::JSON_NULL);
+    return ::make_unique<json::literal> (json::JSON_NULL);
 }
 
 /* Generate a JSON value for OFFSET.
    This is intended for debugging the analyzer rather than serialization and
    thus is a string.  */
 
-json::value *
+std::unique_ptr<json::value>
 bit_offset_to_json (const bit_offset_t &offset)
 {
   pretty_printer pp;
   pp_wide_int_large (&pp, offset, SIGNED);
-  return new json::string (pp_formatted_text (&pp));
+  return ::make_unique<json::string> (pp_formatted_text (&pp));
 }
 
 /* Generate a JSON value for OFFSET.
    This is intended for debugging the analyzer rather than serialization and
    thus is a string.  */
 
-json::value *
+std::unique_ptr<json::value>
 byte_offset_to_json (const byte_offset_t &offset)
 {
   pretty_printer pp;
   pp_wide_int_large (&pp, offset, SIGNED);
-  return new json::string (pp_formatted_text (&pp));
+  return ::make_unique<json::string> (pp_formatted_text (&pp));
 }
 
 /* Workaround for lack of const-correctness of ssa_default_def.  */
diff --git a/gcc/analyzer/analyzer.h b/gcc/analyzer/analyzer.h
index 334b0d32bd05..db152b776ccd 100644
--- a/gcc/analyzer/analyzer.h
+++ b/gcc/analyzer/analyzer.h
@@ -416,16 +416,16 @@  extern void log_stashed_constants (logger *logger);
 
 extern FILE *get_or_create_any_logfile ();
 
-extern json::value *
+extern std::unique_ptr<json::value>
 tree_to_json (tree node);
 
-extern json::value *
+extern std::unique_ptr<json::value>
 diagnostic_event_id_to_json (const diagnostic_event_id_t &);
 
-extern json::value *
+extern std::unique_ptr<json::value>
 bit_offset_to_json (const bit_offset_t &offset);
 
-extern json::value *
+extern std::unique_ptr<json::value>
 byte_offset_to_json (const byte_offset_t &offset);
 
 extern tristate
diff --git a/gcc/analyzer/call-string.cc b/gcc/analyzer/call-string.cc
index c404c09ca0df..024a1fec03ef 100644
--- a/gcc/analyzer/call-string.cc
+++ b/gcc/analyzer/call-string.cc
@@ -38,6 +38,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/analyzer-logging.h"
 #include "analyzer/call-string.h"
 #include "analyzer/supergraph.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -103,18 +104,18 @@  call_string::print (pretty_printer *pp) const
      "funcname" : str},
      ...for each element in the callstring].  */
 
-json::value *
+std::unique_ptr<json::value>
 call_string::to_json () const
 {
-  json::array *arr = new json::array ();
+  auto arr = ::make_unique<json::array> ();
 
   for (const call_string::element_t &e : m_elements)
     {
-      json::object *e_obj = new json::object ();
+      auto e_obj = ::make_unique<json::object> ();
       e_obj->set_integer ("src_snode_idx", e.m_callee->m_index);
       e_obj->set_integer ("dst_snode_idx", e.m_caller->m_index);
       e_obj->set_string ("funcname", function_name (e.m_caller->m_fun));
-      arr->append (e_obj);
+      arr->append (std::move (e_obj));
     }
 
   return arr;
diff --git a/gcc/analyzer/call-string.h b/gcc/analyzer/call-string.h
index 1c17e2763016..b843067d679a 100644
--- a/gcc/analyzer/call-string.h
+++ b/gcc/analyzer/call-string.h
@@ -72,7 +72,7 @@  public:
 
   void print (pretty_printer *pp) const;
 
-  json::value *to_json () const;
+  std::unique_ptr<json::value> to_json () const;
 
   bool empty_p () const { return m_elements.is_empty (); }
 
diff --git a/gcc/analyzer/constraint-manager.cc b/gcc/analyzer/constraint-manager.cc
index 59487034cde7..429a3a0e2a71 100644
--- a/gcc/analyzer/constraint-manager.cc
+++ b/gcc/analyzer/constraint-manager.cc
@@ -50,6 +50,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/call-summary.h"
 #include "analyzer/analyzer-selftests.h"
 #include "tree-pretty-print.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -446,12 +447,12 @@  bounded_range::dump (bool show_types) const
   pp_newline (&pp);
 }
 
-json::object *
+std::unique_ptr<json::object>
 bounded_range::to_json () const
 {
-  json::object *range_obj = new json::object ();
-  set_json_attr (range_obj, "lower", m_lower);
-  set_json_attr (range_obj, "upper", m_upper);
+  auto range_obj = ::make_unique<json::object> ();
+  set_json_attr (*range_obj, "lower", m_lower);
+  set_json_attr (*range_obj, "upper", m_upper);
   return range_obj;
 }
 
@@ -466,12 +467,12 @@  bounded_range::make_dump_widget (const text_art::dump_widget_info &dwi) const
 /* Subroutine of bounded_range::to_json.  */
 
 void
-bounded_range::set_json_attr (json::object *obj, const char *name, tree value)
+bounded_range::set_json_attr (json::object &obj, const char *name, tree value)
 {
   pretty_printer pp;
   pp_format_decoder (&pp) = default_tree_printer;
   pp_printf (&pp, "%E", value);
-  obj->set_string (name, pp_formatted_text (&pp));
+  obj.set_string (name, pp_formatted_text (&pp));
 }
 
 
@@ -715,10 +716,10 @@  bounded_ranges::dump (bool show_types) const
   pp_newline (&pp);
 }
 
-json::value *
+std::unique_ptr<json::value>
 bounded_ranges::to_json () const
 {
-  json::array *arr_obj = new json::array ();
+  auto arr_obj = ::make_unique<json::array> ();
 
   for (unsigned i = 0; i < m_ranges.length (); ++i)
     arr_obj->append (m_ranges[i].to_json ());
@@ -1113,15 +1114,15 @@  equiv_class::print (pretty_printer *pp) const
    {"svals" : [str],
     "constant" : optional str}.  */
 
-json::object *
+std::unique_ptr<json::object>
 equiv_class::to_json () const
 {
-  json::object *ec_obj = new json::object ();
+  auto ec_obj = ::make_unique<json::object> ();
 
-  json::array *sval_arr = new json::array ();
+  auto sval_arr = ::make_unique<json::array> ();
   for (const svalue *sval : m_vars)
     sval_arr->append (sval->to_json ());
-  ec_obj->set ("svals", sval_arr);
+  ec_obj->set ("svals", std::move (sval_arr));
 
   if (m_constant)
     {
@@ -1380,10 +1381,10 @@  constraint::print (pretty_printer *pp, const constraint_manager &cm) const
     "op"  : str,
     "rhs" : int, the EC index}.  */
 
-json::object *
+std::unique_ptr<json::object>
 constraint::to_json () const
 {
-  json::object *con_obj = new json::object ();
+  auto con_obj = ::make_unique<json::object> ();
 
   con_obj->set_integer ("lhs", m_lhs.as_int ());
   con_obj->set_string ("op", constraint_op_code (m_op));
@@ -1468,10 +1469,10 @@  bounded_ranges_constraint::print (pretty_printer *pp,
   m_ranges->dump_to_pp (pp, true);
 }
 
-json::object *
+std::unique_ptr<json::object>
 bounded_ranges_constraint::to_json () const
 {
-  json::object *con_obj = new json::object ();
+  auto con_obj = ::make_unique<json::object> ();
 
   con_obj->set_integer ("ec", m_ec_id.as_int ());
   con_obj->set ("ranges", m_ranges->to_json ());
@@ -1781,33 +1782,33 @@  debug (const constraint_manager &cm)
    {"ecs" : array of objects, one per equiv_class
     "constraints" : array of objects, one per constraint}.  */
 
-json::object *
+std::unique_ptr<json::object>
 constraint_manager::to_json () const
 {
-  json::object *cm_obj = new json::object ();
+  auto cm_obj = ::make_unique<json::object> ();
 
   /* Equivalence classes.  */
   {
-    json::array *ec_arr = new json::array ();
+    auto ec_arr = ::make_unique<json::array> ();
     for (const equiv_class *ec : m_equiv_classes)
       ec_arr->append (ec->to_json ());
-    cm_obj->set ("ecs", ec_arr);
+    cm_obj->set ("ecs", std::move (ec_arr));
   }
 
   /* Constraints.  */
   {
-    json::array *con_arr = new json::array ();
+    auto con_arr = ::make_unique<json::array> ();
     for (const constraint &c : m_constraints)
       con_arr->append (c.to_json ());
-    cm_obj->set ("constraints", con_arr);
+    cm_obj->set ("constraints", std::move (con_arr));
   }
 
   /* m_bounded_ranges_constraints.  */
   {
-    json::array *con_arr = new json::array ();
+    auto con_arr = ::make_unique<json::array> ();
     for (const auto &c : m_bounded_ranges_constraints)
       con_arr->append (c.to_json ());
-    cm_obj->set ("bounded_ranges_constraints", con_arr);
+    cm_obj->set ("bounded_ranges_constraints", std::move (con_arr));
   }
 
   return cm_obj;
diff --git a/gcc/analyzer/constraint-manager.h b/gcc/analyzer/constraint-manager.h
index 81e9c7ec035c..399758b392f0 100644
--- a/gcc/analyzer/constraint-manager.h
+++ b/gcc/analyzer/constraint-manager.h
@@ -85,7 +85,7 @@  struct bounded_range
   void dump_to_pp (pretty_printer *pp, bool show_types) const;
   void dump (bool show_types) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::widget>
   make_dump_widget (const text_art::dump_widget_info &dwi) const;
@@ -112,7 +112,7 @@  struct bounded_range
   tree m_upper;
 
 private:
-  static void set_json_attr (json::object *obj, const char *name, tree value);
+  static void set_json_attr (json::object &obj, const char *name, tree value);
 };
 
 /* A collection of bounded_range instances, suitable
@@ -135,7 +135,7 @@  public:
   void dump_to_pp (pretty_printer *pp, bool show_types) const;
   void dump (bool show_types) const;
 
-  json::value *to_json () const;
+  std::unique_ptr<json::value> to_json () const;
 
   void add_to_dump_widget (text_art::tree_widget &parent,
 			   const text_art::dump_widget_info &dwi) const;
@@ -271,7 +271,7 @@  public:
 
   void print (pretty_printer *pp) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi,
@@ -351,7 +351,7 @@  class constraint
 
   void print (pretty_printer *pp, const constraint_manager &cm) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::widget>
   make_dump_widget (const text_art::dump_widget_info &dwi,
@@ -398,7 +398,7 @@  public:
 
   void print (pretty_printer *pp, const constraint_manager &cm) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   bool operator== (const bounded_ranges_constraint &other) const;
   bool operator!= (const bounded_ranges_constraint &other) const
@@ -442,7 +442,7 @@  public:
   void dump (FILE *fp) const;
   void dump () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi) const;
diff --git a/gcc/analyzer/diagnostic-manager.cc b/gcc/analyzer/diagnostic-manager.cc
index 0e5e96c3f936..999fb9cee0b4 100644
--- a/gcc/analyzer/diagnostic-manager.cc
+++ b/gcc/analyzer/diagnostic-manager.cc
@@ -740,10 +740,10 @@  saved_diagnostic::add_event (std::unique_ptr<checker_event> event)
     "pending_diagnostic": str,
     "idx": int}.  */
 
-json::object *
+std::unique_ptr<json::object>
 saved_diagnostic::to_json () const
 {
-  json::object *sd_obj = new json::object ();
+  auto sd_obj = ::make_unique<json::object> ();
 
   if (m_sm)
     sd_obj->set_string ("sm", m_sm->get_name ());
@@ -1216,18 +1216,18 @@  diagnostic_manager::add_event (std::unique_ptr<checker_event> event)
 /* Return a new json::object of the form
    {"diagnostics"  : [obj for saved_diagnostic]}.  */
 
-json::object *
+std::unique_ptr<json::object>
 diagnostic_manager::to_json () const
 {
-  json::object *dm_obj = new json::object ();
+  auto dm_obj = ::make_unique<json::object> ();
 
   {
-    json::array *sd_arr = new json::array ();
+    auto sd_arr = ::make_unique<json::array> ();
     int i;
     saved_diagnostic *sd;
     FOR_EACH_VEC_ELT (m_saved_diagnostics, i, sd)
       sd_arr->append (sd->to_json ());
-    dm_obj->set ("diagnostics", sd_arr);
+    dm_obj->set ("diagnostics", std::move (sd_arr));
   }
 
   return dm_obj;
diff --git a/gcc/analyzer/diagnostic-manager.h b/gcc/analyzer/diagnostic-manager.h
index 8d55344693e0..6fbbe3e47ef6 100644
--- a/gcc/analyzer/diagnostic-manager.h
+++ b/gcc/analyzer/diagnostic-manager.h
@@ -42,7 +42,7 @@  public:
   void add_note (std::unique_ptr<pending_note> pn);
   void add_event (std::unique_ptr<checker_event> event);
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   void dump_dot_id (pretty_printer *pp) const;
   void dump_as_dot_node (pretty_printer *pp) const;
@@ -157,7 +157,7 @@  public:
 
   engine *get_engine () const { return m_eng; }
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   bool add_diagnostic (const state_machine *sm,
 		       const pending_location &ploc,
diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc
index ca81285175b6..d5328d7e162e 100644
--- a/gcc/analyzer/engine.cc
+++ b/gcc/analyzer/engine.cc
@@ -1438,10 +1438,10 @@  exploded_node::dump (const extrinsic_state &ext_state) const
     "idx"    : int,
     "processed_stmts" : int}.  */
 
-json::object *
+std::unique_ptr<json::object>
 exploded_node::to_json (const extrinsic_state &ext_state) const
 {
-  json::object *enode_obj = new json::object ();
+  auto enode_obj = ::make_unique<json::object> ();
 
   enode_obj->set ("point", get_point ().to_json ());
   enode_obj->set ("state", get_state ().to_json (ext_state));
@@ -2292,10 +2292,10 @@  exploded_edge::dump_dot_label (pretty_printer *pp) const
     "sedge": (optional) object for the superedge, if any,
     "custom": (optional) str, a description, if this is a custom edge}.  */
 
-json::object *
+std::unique_ptr<json::object>
 exploded_edge::to_json () const
 {
-  json::object *eedge_obj = new json::object ();
+  auto eedge_obj = ::make_unique<json::object> ();
   eedge_obj->set_integer ("src_idx", m_src->m_index);
   eedge_obj->set_integer ("dst_idx", m_dest->m_index);
   if (m_sedge)
@@ -2418,10 +2418,10 @@  strongly_connected_components::dump () const
 
 /* Return a new json::array of per-snode SCC ids.  */
 
-json::array *
+std::unique_ptr<json::array>
 strongly_connected_components::to_json () const
 {
-  json::array *scc_arr = new json::array ();
+  auto scc_arr = ::make_unique<json::array> ();
   for (int i = 0; i < m_sg.num_nodes (); i++)
     scc_arr->append (new json::integer_number (get_scc_id (i)));
   return scc_arr;
@@ -2639,10 +2639,10 @@  worklist::key_t::cmp (const worklist::key_t &ka, const worklist::key_t &kb)
 /* Return a new json::object of the form
    {"scc" : [per-snode-IDs]},  */
 
-json::object *
+std::unique_ptr<json::object>
 worklist::to_json () const
 {
-  json::object *worklist_obj = new json::object ();
+  auto worklist_obj = ::make_unique<json::object> ();
 
   worklist_obj->set ("scc", m_scc.to_json ());
 
@@ -4658,29 +4658,29 @@  exploded_graph::dump_states_for_supernode (FILE *out,
     "ext_state": object for extrinsic_state,
     "diagnostic_manager": object for diagnostic_manager}.  */
 
-json::object *
+std::unique_ptr<json::object>
 exploded_graph::to_json () const
 {
-  json::object *egraph_obj = new json::object ();
+  auto egraph_obj = ::make_unique<json::object> ();
 
   /* Nodes.  */
   {
-    json::array *nodes_arr = new json::array ();
+    auto nodes_arr = ::make_unique<json::array> ();
     unsigned i;
     exploded_node *n;
     FOR_EACH_VEC_ELT (m_nodes, i, n)
       nodes_arr->append (n->to_json (m_ext_state));
-    egraph_obj->set ("nodes", nodes_arr);
+    egraph_obj->set ("nodes", std::move (nodes_arr));
   }
 
   /* Edges.  */
   {
-    json::array *edges_arr = new json::array ();
+    auto edges_arr = ::make_unique<json::array> ();
     unsigned i;
     exploded_edge *n;
     FOR_EACH_VEC_ELT (m_edges, i, n)
       edges_arr->append (n->to_json ());
-    egraph_obj->set ("edges", edges_arr);
+    egraph_obj->set ("edges", std::move (edges_arr));
   }
 
   /* m_sg is JSONified at the top-level.  */
@@ -6095,7 +6095,7 @@  dump_analyzer_json (const supergraph &sg,
       return;
     }
 
-  json::object *toplev_obj = new json::object ();
+  auto toplev_obj = ::make_unique<json::object> ();
   toplev_obj->set ("sgraph", sg.to_json ());
   toplev_obj->set ("egraph", eg.to_json ());
 
@@ -6103,8 +6103,6 @@  dump_analyzer_json (const supergraph &sg,
   toplev_obj->print (&pp, flag_diagnostics_json_formatting);
   pp_formatted_text (&pp);
 
-  delete toplev_obj;
-
   if (gzputs (output, pp_formatted_text (&pp)) == EOF
       || gzclose (output))
     error_at (UNKNOWN_LOCATION, "error writing %qs", filename);
diff --git a/gcc/analyzer/exploded-graph.h b/gcc/analyzer/exploded-graph.h
index aa18bf468d9e..0e05a5db3f71 100644
--- a/gcc/analyzer/exploded-graph.h
+++ b/gcc/analyzer/exploded-graph.h
@@ -239,7 +239,7 @@  class exploded_node : public dnode<eg_traits>
   void dump_processed_stmts (pretty_printer *pp) const;
   void dump_saved_diagnostics (pretty_printer *pp) const;
 
-  json::object *to_json (const extrinsic_state &ext_state) const;
+  std::unique_ptr<json::object> to_json (const extrinsic_state &ext_state) const;
 
   /* The result of on_stmt.  */
   struct on_stmt_flags
@@ -387,7 +387,7 @@  class exploded_edge : public dedge<eg_traits>
     const final override;
   void dump_dot_label (pretty_printer *pp) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   //private:
   const superedge *const m_sedge;
@@ -688,7 +688,7 @@  public:
 
   void dump () const;
 
-  json::array *to_json () const;
+  std::unique_ptr<json::array> to_json () const;
 
 private:
   struct per_node_data
@@ -732,7 +732,7 @@  public:
     return m_scc.get_scc_id (snode.m_index);
   }
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
 private:
   class key_t
@@ -867,7 +867,7 @@  public:
   void dump_states_for_supernode (FILE *, const supernode *snode) const;
   void dump_exploded_nodes () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   exploded_node *get_node_by_index (int idx) const;
 
diff --git a/gcc/analyzer/program-point.cc b/gcc/analyzer/program-point.cc
index 313df9af1d31..bfb1dd48f801 100644
--- a/gcc/analyzer/program-point.cc
+++ b/gcc/analyzer/program-point.cc
@@ -54,6 +54,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/exploded-graph.h"
 #include "analyzer/analysis-plan.h"
 #include "analyzer/inlining-iterator.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -313,10 +314,10 @@  program_point::dump () const
     "stmt_idx": int (only for kind=='PK_BEFORE_STMT',
     "call_string": object for the call_string}.  */
 
-json::object *
+std::unique_ptr<json::object>
 program_point::to_json () const
 {
-  json::object *point_obj = new json::object ();
+  auto point_obj = ::make_unique<json::object> ();
 
   point_obj->set_string ("kind", point_kind_to_string (get_kind ()));
 
diff --git a/gcc/analyzer/program-point.h b/gcc/analyzer/program-point.h
index 61b895f4499b..a2e04204f17d 100644
--- a/gcc/analyzer/program-point.h
+++ b/gcc/analyzer/program-point.h
@@ -184,7 +184,7 @@  public:
   void print (pretty_printer *pp, const format &f) const;
   void dump () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   hashval_t hash () const;
   bool operator== (const program_point &other) const
diff --git a/gcc/analyzer/program-state.cc b/gcc/analyzer/program-state.cc
index bc7e30eacd50..5cad3e68bf01 100644
--- a/gcc/analyzer/program-state.cc
+++ b/gcc/analyzer/program-state.cc
@@ -56,6 +56,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/analyzer-selftests.h"
 #include "text-art/tree-widget.h"
 #include "text-art/dump.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -98,18 +99,18 @@  extrinsic_state::dump () const
 /* Return a new json::object of the form
    {"checkers"  : array of objects, one for each state_machine}.  */
 
-json::object *
+std::unique_ptr<json::object>
 extrinsic_state::to_json () const
 {
-  json::object *ext_state_obj = new json::object ();
+  auto ext_state_obj = ::make_unique<json::object> ();
 
   {
-    json::array *checkers_arr = new json::array ();
+    auto checkers_arr = ::make_unique<json::array> ();
     unsigned i;
     state_machine *sm;
     FOR_EACH_VEC_ELT (m_checkers, i, sm)
       checkers_arr->append (sm->to_json ());
-    ext_state_obj->set ("checkers", checkers_arr);
+    ext_state_obj->set ("checkers", std::move (checkers_arr));
   }
 
   return ext_state_obj;
@@ -276,10 +277,10 @@  sm_state_map::dump (bool simple) const
    {"global"  : (optional) value for global state,
     SVAL_DESC : value for state}.  */
 
-json::object *
+std::unique_ptr<json::object>
 sm_state_map::to_json () const
 {
-  json::object *map_obj = new json::object ();
+  auto map_obj = ::make_unique<json::object> ();
 
   if (m_global_state != m_sm.get_start_state ())
     map_obj->set ("global", m_global_state->to_json ());
@@ -1185,10 +1186,10 @@  program_state::dump () const
     "checkers" : { STATE_NAME : object per sm_state_map },
     "valid" : true/false}.  */
 
-json::object *
+std::unique_ptr<json::object>
 program_state::to_json (const extrinsic_state &ext_state) const
 {
-  json::object *state_obj = new json::object ();
+  auto state_obj = ::make_unique<json::object> ();
 
   state_obj->set ("store", m_region_model->get_store ()->to_json ());
   state_obj->set ("constraints",
@@ -1199,7 +1200,7 @@  program_state::to_json (const extrinsic_state &ext_state) const
 
   /* Provide m_checker_states as an object, using names as keys.  */
   {
-    json::object *checkers_obj = new json::object ();
+    auto checkers_obj = ::make_unique<json::object> ();
 
     int i;
     sm_state_map *smap;
@@ -1207,7 +1208,7 @@  program_state::to_json (const extrinsic_state &ext_state) const
       if (!smap->is_empty_p ())
 	checkers_obj->set (ext_state.get_name (i), smap->to_json ());
 
-    state_obj->set ("checkers", checkers_obj);
+    state_obj->set ("checkers", std::move (checkers_obj));
   }
 
   state_obj->set_bool ("valid", m_valid);
diff --git a/gcc/analyzer/program-state.h b/gcc/analyzer/program-state.h
index 322ca8d0f11a..a9b4be2102c5 100644
--- a/gcc/analyzer/program-state.h
+++ b/gcc/analyzer/program-state.h
@@ -55,7 +55,7 @@  public:
   void dump_to_file (FILE *outf) const;
   void dump () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   engine *get_engine () const { return m_engine; }
   region_model_manager *get_model_manager () const;
@@ -117,7 +117,7 @@  public:
 	      pretty_printer *pp) const;
   void dump (bool simple) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi,
@@ -231,7 +231,8 @@  public:
   void dump (const extrinsic_state &ext_state, bool simple) const;
   void dump () const;
 
-  json::object *to_json (const extrinsic_state &ext_state) const;
+  std::unique_ptr<json::object>
+  to_json (const extrinsic_state &ext_state) const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi) const;
diff --git a/gcc/analyzer/ranges.cc b/gcc/analyzer/ranges.cc
index 3323a96fed10..420aac4a910d 100644
--- a/gcc/analyzer/ranges.cc
+++ b/gcc/analyzer/ranges.cc
@@ -54,6 +54,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/constraint-manager.h"
 #include "analyzer/analyzer-selftests.h"
 #include "analyzer/ranges.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -100,7 +101,7 @@  symbolic_byte_offset::dump (bool simple) const
   pp_newline (&pp);
 }
 
-json::value *
+std::unique_ptr<json::value>
 symbolic_byte_offset::to_json () const
 {
   return m_num_bytes_sval->to_json ();
@@ -155,10 +156,10 @@  symbolic_byte_range::dump (bool simple, region_model_manager &mgr) const
   pp_newline (&pp);
 }
 
-json::value *
+std::unique_ptr<json::value>
 symbolic_byte_range::to_json () const
 {
-  json::object *obj = new json::object ();
+  auto obj = ::make_unique<json::object> ();
   obj->set ("start", m_start.to_json ());
   obj->set ("size", m_size.to_json ());
   return obj;
diff --git a/gcc/analyzer/ranges.h b/gcc/analyzer/ranges.h
index aca4554bde69..b784cf470075 100644
--- a/gcc/analyzer/ranges.h
+++ b/gcc/analyzer/ranges.h
@@ -39,7 +39,7 @@  public:
   void dump_to_pp (pretty_printer *pp, bool) const;
   void dump (bool) const;
 
-  json::value *to_json () const;
+  std::unique_ptr<json::value> to_json () const;
 
   bool operator== (const symbolic_byte_offset &other) const
   {
@@ -72,7 +72,7 @@  public:
 		   region_model_manager &mgr) const;
   void dump (bool, region_model_manager &mgr) const;
 
-  json::value *to_json () const;
+  std::unique_ptr<json::value> to_json () const;
 
   bool empty_p () const;
 
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index d7fd03831eb5..aa4e9982c891 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -232,10 +232,10 @@  region_to_value_map::dump (bool simple) const
    This is intended for debugging the analyzer rather than
    serialization.  */
 
-json::object *
+std::unique_ptr<json::object>
 region_to_value_map::to_json () const
 {
-  json::object *map_obj = new json::object ();
+  auto map_obj = ::make_unique<json::object> ();
 
   auto_vec<const region *> regs;
   for (iterator iter = begin (); iter != end (); ++iter)
@@ -512,10 +512,10 @@  region_model::debug () const
    This is intended for debugging the analyzer rather than
    serialization.  */
 
-json::object *
+std::unique_ptr<json::object>
 region_model::to_json () const
 {
-  json::object *model_obj = new json::object ();
+  auto model_obj = ::make_unique<json::object> ();
   model_obj->set ("store", m_store.to_json ());
   model_obj->set ("constraints", m_constraints->to_json ());
   if (m_current_frame)
diff --git a/gcc/analyzer/region-model.h b/gcc/analyzer/region-model.h
index 7ae4a798eff1..97468b9e7f2b 100644
--- a/gcc/analyzer/region-model.h
+++ b/gcc/analyzer/region-model.h
@@ -177,7 +177,7 @@  public:
   void dump_to_pp (pretty_printer *pp, bool simple, bool multiline) const;
   void dump (bool simple) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi) const;
@@ -286,7 +286,7 @@  class region_model
 
   void debug () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi) const;
diff --git a/gcc/analyzer/region.cc b/gcc/analyzer/region.cc
index 59b09e5c81ce..ac1ea646eb83 100644
--- a/gcc/analyzer/region.cc
+++ b/gcc/analyzer/region.cc
@@ -59,6 +59,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/sm.h"
 #include "analyzer/program-state.h"
 #include "text-art/dump.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -1035,11 +1036,11 @@  region::dump () const
 
 /* Return a new json::string describing the region.  */
 
-json::value *
+std::unique_ptr<json::value>
 region::to_json () const
 {
   label_text desc = get_desc (true);
-  json::value *reg_js = new json::string (desc.get ());
+  auto reg_js = ::make_unique<json::string> (desc.get ());
   return reg_js;
 }
 
diff --git a/gcc/analyzer/region.h b/gcc/analyzer/region.h
index ffc05e034f1f..00a8c7680d50 100644
--- a/gcc/analyzer/region.h
+++ b/gcc/analyzer/region.h
@@ -176,7 +176,7 @@  public:
   void dump (bool simple) const;
   void dump () const;
 
-  json::value *to_json () const;
+  std::unique_ptr<json::value> to_json () const;
 
 
   bool maybe_print_for_user (pretty_printer *pp,
diff --git a/gcc/analyzer/sm.cc b/gcc/analyzer/sm.cc
index f8b21b85db03..4c4b2eaf73ef 100644
--- a/gcc/analyzer/sm.cc
+++ b/gcc/analyzer/sm.cc
@@ -42,6 +42,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/svalue.h"
 #include "analyzer/program-state.h"
 #include "analyzer/pending-diagnostic.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -77,13 +78,13 @@  state_machine::state::dump_to_pp (pretty_printer *pp) const
 
 /* Return a new json::string describing the state.  */
 
-json::value *
+std::unique_ptr<json::value>
 state_machine::state::to_json () const
 {
   pretty_printer pp;
   pp_format_decoder (&pp) = default_tree_printer;
   dump_to_pp (&pp);
-  return new json::string (pp_formatted_text (&pp));
+  return ::make_unique<json::string> (pp_formatted_text (&pp));
 }
 
 /* class state_machine.  */
@@ -151,19 +152,19 @@  state_machine::dump_to_pp (pretty_printer *pp) const
    {"name" : str,
     "states" : [str]}.  */
 
-json::object *
+std::unique_ptr<json::object>
 state_machine::to_json () const
 {
-  json::object *sm_obj = new json::object ();
+  auto sm_obj = ::make_unique<json::object> ();
 
   sm_obj->set_string ("name", m_name);
   {
-    json::array *states_arr = new json::array ();
+    auto states_arr = ::make_unique<json::array> ();
     unsigned i;
     state *s;
     FOR_EACH_VEC_ELT (m_states, i, s)
       states_arr->append (s->to_json ());
-    sm_obj->set ("states", states_arr);
+    sm_obj->set ("states", std::move (states_arr));
   }
 
   return sm_obj;
diff --git a/gcc/analyzer/sm.h b/gcc/analyzer/sm.h
index aa0c4f67f51e..cdd6b4f381c4 100644
--- a/gcc/analyzer/sm.h
+++ b/gcc/analyzer/sm.h
@@ -49,7 +49,7 @@  public:
 
     const char *get_name () const { return m_name; }
     virtual void dump_to_pp (pretty_printer *pp) const;
-    virtual json::value *to_json () const;
+    virtual std::unique_ptr<json::value> to_json () const;
 
     unsigned get_id () const { return m_id; }
 
@@ -180,7 +180,7 @@  public:
 
   void dump_to_pp (pretty_printer *pp) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   state_t get_start_state () const { return m_start; }
 
diff --git a/gcc/analyzer/store.cc b/gcc/analyzer/store.cc
index 6dc4bb5cad48..e95c86ff516a 100644
--- a/gcc/analyzer/store.cc
+++ b/gcc/analyzer/store.cc
@@ -56,6 +56,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "analyzer/analyzer-selftests.h"
 #include "stor-layout.h"
 #include "text-art/tree-widget.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -231,10 +232,10 @@  bit_range::dump () const
    This is intended for debugging the analyzer rather
    than serialization.  */
 
-json::object *
+std::unique_ptr<json::object>
 bit_range::to_json () const
 {
-  json::object *obj = new json::object ();
+  auto obj = ::make_unique<json::object> ();
   obj->set ("start_bit_offset",
 	    bit_offset_to_json (m_start_bit_offset));
   obj->set ("size_in_bits",
@@ -505,10 +506,10 @@  byte_range::dump () const
    This is intended for debugging the analyzer rather
    than serialization.  */
 
-json::object *
+std::unique_ptr<json::object>
 byte_range::to_json () const
 {
-  json::object *obj = new json::object ();
+  auto obj = ::make_unique<json::object> ();
   obj->set ("start_byte_offset",
 	    byte_offset_to_json (m_start_byte_offset));
   obj->set ("size_in_bytes",
@@ -770,10 +771,10 @@  binding_map::dump (bool simple) const
    {KEY_DESC : SVALUE_DESC,
     ...for the various key/value pairs in this binding_map}.  */
 
-json::object *
+std::unique_ptr<json::object>
 binding_map::to_json () const
 {
-  json::object *map_obj = new json::object ();
+  auto map_obj = ::make_unique<json::object> ();
 
   auto_vec <const binding_key *> binding_keys;
   for (map_t::iterator iter = m_map.begin ();
@@ -1419,10 +1420,10 @@  binding_cluster::validate () const
     "touched": true/false,
     "map" : object for the binding_map.  */
 
-json::object *
+std::unique_ptr<json::object>
 binding_cluster::to_json () const
 {
-  json::object *cluster_obj = new json::object ();
+  auto cluster_obj = ::make_unique<json::object> ();
 
   cluster_obj->set_bool ("escaped", m_escaped);
   cluster_obj->set_bool ("touched", m_touched);
@@ -2636,10 +2637,10 @@  store::validate () const
     ...for each parent region,
     "called_unknown_fn": true/false}.  */
 
-json::object *
+std::unique_ptr<json::object>
 store::to_json () const
 {
-  json::object *store_obj = new json::object ();
+  auto store_obj = ::make_unique<json::object> ();
 
   /* Sort into some deterministic order.  */
   auto_vec<const region *> base_regions;
@@ -2662,7 +2663,7 @@  store::to_json () const
     {
       gcc_assert (parent_reg);
 
-      json::object *clusters_in_parent_reg_obj = new json::object ();
+      auto clusters_in_parent_reg_obj = ::make_unique<json::object> ();
 
       const region *base_reg;
       unsigned j;
@@ -2678,7 +2679,8 @@  store::to_json () const
 					   cluster->to_json ());
 	}
       label_text parent_reg_desc = parent_reg->get_desc ();
-      store_obj->set (parent_reg_desc.get (), clusters_in_parent_reg_obj);
+      store_obj->set (parent_reg_desc.get (),
+		      std::move (clusters_in_parent_reg_obj));
     }
 
   store_obj->set_bool ("called_unknown_fn", m_called_unknown_fn);
diff --git a/gcc/analyzer/store.h b/gcc/analyzer/store.h
index af9ea4172a2f..34f975a8dcc4 100644
--- a/gcc/analyzer/store.h
+++ b/gcc/analyzer/store.h
@@ -239,7 +239,7 @@  struct bit_range
   void dump_to_pp (pretty_printer *pp) const;
   void dump () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   bool empty_p () const
   {
@@ -315,7 +315,7 @@  struct byte_range
   void dump_to_pp (pretty_printer *pp) const;
   void dump () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   bool empty_p () const
   {
@@ -546,7 +546,7 @@  public:
   void dump_to_pp (pretty_printer *pp, bool simple, bool multiline) const;
   void dump (bool simple) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   void add_to_tree_widget (text_art::tree_widget &parent_widget,
 			   const text_art::dump_widget_info &dwi) const;
@@ -615,7 +615,7 @@  public:
 
   void validate () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi,
@@ -758,7 +758,7 @@  public:
 
   void validate () const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const text_art::dump_widget_info &dwi,
diff --git a/gcc/analyzer/supergraph.cc b/gcc/analyzer/supergraph.cc
index e53c10940d35..9d78b1b44c8d 100644
--- a/gcc/analyzer/supergraph.cc
+++ b/gcc/analyzer/supergraph.cc
@@ -54,6 +54,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "tree-cfg.h"
 #include "analyzer/supergraph.h"
 #include "analyzer/analyzer-logging.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -462,29 +463,29 @@  supergraph::dump_dot (const char *path, const dump_args_t &dump_args) const
    {"nodes" : [objs for snodes],
     "edges" : [objs for sedges]}.  */
 
-json::object *
+std::unique_ptr<json::object>
 supergraph::to_json () const
 {
-  json::object *sgraph_obj = new json::object ();
+  auto sgraph_obj = ::make_unique<json::object> ();
 
   /* Nodes.  */
   {
-    json::array *nodes_arr = new json::array ();
+    auto nodes_arr = ::make_unique<json::array> ();
     unsigned i;
     supernode *n;
     FOR_EACH_VEC_ELT (m_nodes, i, n)
       nodes_arr->append (n->to_json ());
-    sgraph_obj->set ("nodes", nodes_arr);
+    sgraph_obj->set ("nodes", std::move (nodes_arr));
   }
 
   /* Edges.  */
   {
-    json::array *edges_arr = new json::array ();
+    auto edges_arr = ::make_unique<json::array> ();
     unsigned i;
     superedge *n;
     FOR_EACH_VEC_ELT (m_edges, i, n)
       edges_arr->append (n->to_json ());
-    sgraph_obj->set ("edges", edges_arr);
+    sgraph_obj->set ("edges", std::move (edges_arr));
   }
 
   return sgraph_obj;
@@ -717,10 +718,10 @@  supernode::dump_dot_id (pretty_printer *pp) const
     "phis": [str],
     "stmts" : [str]}.  */
 
-json::object *
+std::unique_ptr<json::object>
 supernode::to_json () const
 {
-  json::object *snode_obj = new json::object ();
+  auto snode_obj = ::make_unique<json::object> ();
 
   snode_obj->set_integer ("idx", m_index);
   snode_obj->set_integer ("bb_idx", m_bb->index);
@@ -980,10 +981,10 @@  superedge::dump_dot (graphviz_out *gv, const dump_args_t &) const
     "dst_idx": int, the index of the destination supernode,
     "desc"   : str.  */
 
-json::object *
+std::unique_ptr<json::object>
 superedge::to_json () const
 {
-  json::object *sedge_obj = new json::object ();
+  auto sedge_obj = ::make_unique<json::object> ();
   sedge_obj->set_string ("kind", edge_kind_to_string (m_kind));
   sedge_obj->set_integer ("src_idx", m_src->m_index);
   sedge_obj->set_integer ("dst_idx", m_dest->m_index);
diff --git a/gcc/analyzer/supergraph.h b/gcc/analyzer/supergraph.h
index 86f918bc8b5d..a1bbb9d53904 100644
--- a/gcc/analyzer/supergraph.h
+++ b/gcc/analyzer/supergraph.h
@@ -168,7 +168,7 @@  public:
   void dump_dot_to_file (FILE *fp, const dump_args_t &) const;
   void dump_dot (const char *path, const dump_args_t &) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   int num_nodes () const { return m_nodes.length (); }
   int num_edges () const { return m_edges.length (); }
@@ -255,7 +255,7 @@  class supernode : public dnode<supergraph_traits>
   void dump_dot (graphviz_out *gv, const dump_args_t &args) const override;
   void dump_dot_id (pretty_printer *pp) const;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   location_t get_start_location () const;
   location_t get_end_location () const;
@@ -323,7 +323,7 @@  class superedge : public dedge<supergraph_traits>
   virtual void dump_label_to_pp (pretty_printer *pp,
 				 bool user_facing) const = 0;
 
-  json::object *to_json () const;
+  std::unique_ptr<json::object> to_json () const;
 
   enum edge_kind get_kind () const { return m_kind; }
 
diff --git a/gcc/analyzer/svalue.cc b/gcc/analyzer/svalue.cc
index 663119613fb5..3be861e3f04f 100644
--- a/gcc/analyzer/svalue.cc
+++ b/gcc/analyzer/svalue.cc
@@ -104,11 +104,11 @@  svalue::get_desc (bool simple) const
 
 /* Return a new json::string describing the svalue.  */
 
-json::value *
+std::unique_ptr<json::value>
 svalue::to_json () const
 {
   label_text desc = get_desc (true);
-  json::value *sval_js = new json::string (desc.get ());
+  auto sval_js = ::make_unique<json::string> (desc.get ());
   return sval_js;
 }
 
diff --git a/gcc/analyzer/svalue.h b/gcc/analyzer/svalue.h
index bc2374fe8892..94e1ee4d8c70 100644
--- a/gcc/analyzer/svalue.h
+++ b/gcc/analyzer/svalue.h
@@ -105,7 +105,7 @@  public:
   void dump (bool simple) const;
   label_text get_desc (bool simple=true) const;
 
-  json::value *to_json () const;
+  std::unique_ptr<json::value> to_json () const;
 
   std::unique_ptr<text_art::tree_widget>
   make_dump_widget (const dump_widget_info &dwi,