aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/error.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/error.cc')
-rw-r--r--gcc/cp/error.cc46
1 files changed, 37 insertions, 9 deletions
diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc
index 75bf7dc..a6a4a8c 100644
--- a/gcc/cp/error.cc
+++ b/gcc/cp/error.cc
@@ -182,9 +182,10 @@ class cxx_format_postprocessor : public format_postprocessor
: m_type_a (), m_type_b ()
{}
- format_postprocessor *clone() const final override
+ std::unique_ptr<format_postprocessor>
+ clone() const final override
{
- return new cxx_format_postprocessor ();
+ return std::make_unique<cxx_format_postprocessor> ();
}
void handle (pretty_printer *pp) final override;
@@ -193,6 +194,32 @@ class cxx_format_postprocessor : public format_postprocessor
deferred_printed_type m_type_b;
};
+/* Constructor and destructor for cxx_dump_pretty_printer, defined here to
+ avoid needing to move cxx_format_postprocessor into the header as well. */
+
+cxx_dump_pretty_printer::
+cxx_dump_pretty_printer (int phase)
+ : phase (phase)
+{
+ outf = dump_begin (phase, &flags);
+ if (outf)
+ {
+ pp_format_decoder (this) = cp_printer;
+ set_format_postprocessor (std::make_unique<cxx_format_postprocessor> ());
+ set_output_stream (outf);
+ }
+}
+
+cxx_dump_pretty_printer::
+~cxx_dump_pretty_printer ()
+{
+ if (outf)
+ {
+ pp_flush (this);
+ dump_end (phase, outf);
+ }
+}
+
/* Return the in-scope template that's currently being parsed, or
NULL_TREE otherwise. */
@@ -274,7 +301,7 @@ void
cxx_initialize_diagnostics (diagnostic_context *context)
{
cxx_pretty_printer *pp = new cxx_pretty_printer ();
- pp_format_postprocessor (pp) = new cxx_format_postprocessor ();
+ pp->set_format_postprocessor (std::make_unique<cxx_format_postprocessor> ());
context->set_pretty_printer (std::unique_ptr<pretty_printer> (pp));
c_common_diagnostics_set_defaults (context);
@@ -541,12 +568,13 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args,
/* If the template argument repeats the template parameter (T = T),
skip the parameter.*/
if (arg && TREE_CODE (arg) == TEMPLATE_TYPE_PARM
- && TREE_CODE (parm_i) == TREE_LIST
- && TREE_CODE (TREE_VALUE (parm_i)) == TYPE_DECL
- && TREE_CODE (TREE_TYPE (TREE_VALUE (parm_i)))
- == TEMPLATE_TYPE_PARM
- && DECL_NAME (TREE_VALUE (parm_i))
- == DECL_NAME (TREE_CHAIN (arg)))
+ && arg == TYPE_MAIN_VARIANT (arg)
+ && TREE_CODE (parm_i) == TREE_LIST
+ && TREE_CODE (TREE_VALUE (parm_i)) == TYPE_DECL
+ && (TREE_CODE (TREE_TYPE (TREE_VALUE (parm_i)))
+ == TEMPLATE_TYPE_PARM)
+ && (DECL_NAME (TREE_VALUE (parm_i))
+ == DECL_NAME (TYPE_STUB_DECL (arg))))
continue;
semicolon_or_introducer ();