This patch provides a way to clone a pretty_printer.
This is needed so that we can capture text in a label_text and make
layout decisions based on it, using the policy of global_dc's printer,
whilst within a call to diagnostic_show_locus. We can't print with
the pretty_printer itself within a call to diagnostic_show_locus since
it has partly-buffered content.
gcc/c-family/ChangeLog:
* c-pretty-print.c (c_pretty_printer::clone): New vfunc
implementation.
* c-pretty-print.h (c_pretty_printer::clone): New vfunc decl.
gcc/cp/ChangeLog:
* cxx-pretty-print.c (cxx_pretty_printer::clone): New vfunc
implementation.
* cxx-pretty-print.h (cxx_pretty_printer::clone): New vfunc decl.
* error.c (cxx_format_postprocessor::clone): New vfunc.
gcc/ChangeLog:
* pretty-print.c (pretty_printer::pretty_printer): New copy-ctor.
(pretty_printer::clone): New vfunc implementation.
* pretty-print.h (format_postprocessor::clone): New pure vfunc
decl.
(pretty_printer::pretty_printer): New copy-ctor decl.
(pretty_printer::clone): New vfunc decl.
From-SVN: r279244
+2019-12-11 David Malcolm <dmalcolm@redhat.com>
+
+ * pretty-print.c (pretty_printer::pretty_printer): New copy-ctor.
+ (pretty_printer::clone): New vfunc implementation.
+ * pretty-print.h (format_postprocessor::clone): New pure vfunc
+ decl.
+ (pretty_printer::pretty_printer): New copy-ctor decl.
+ (pretty_printer::clone): New vfunc decl.
+
2019-12-11 David Malcolm <dmalcolm@redhat.com>
* function-tests.c (selftest::make_fndecl): Make non-static.
+2019-12-11 David Malcolm <dmalcolm@redhat.com>
+
+ * c-pretty-print.c (c_pretty_printer::clone): New vfunc
+ implementation.
+ * c-pretty-print.h (c_pretty_printer::clone): New vfunc decl.
+
2019-12-09 David Malcolm <dmalcolm@redhat.com>
* c-format.c (range_label_for_format_type_mismatch::get_text):
parameter_list = pp_c_parameter_type_list;
}
+/* c_pretty_printer's implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+c_pretty_printer::clone () const
+{
+ return new c_pretty_printer (*this);
+}
/* Print the tree T in full, on file FILE. */
{
public:
c_pretty_printer ();
+ pretty_printer *clone () const OVERRIDE;
// Format string, possibly translated.
void translate_string (const char *);
+2019-12-11 David Malcolm <dmalcolm@redhat.com>
+
+ * cxx-pretty-print.c (cxx_pretty_printer::clone): New vfunc
+ implementation.
+ * cxx-pretty-print.h (cxx_pretty_printer::clone): New vfunc decl.
+ * error.c (cxx_format_postprocessor::clone): New vfunc.
+
2019-12-11 Jakub Jelinek <jakub@redhat.com>
PR c++/92869
type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
}
+
+/* cxx_pretty_printer's implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+cxx_pretty_printer::clone () const
+{
+ return new cxx_pretty_printer (*this);
+}
public:
cxx_pretty_printer ();
+ pretty_printer *clone () const OVERRIDE;
+
void constant (tree);
void id_expression (tree);
void primary_expression (tree);
: m_type_a (), m_type_b ()
{}
+ format_postprocessor *clone() const FINAL OVERRIDE
+ {
+ return new cxx_format_postprocessor ();
+ }
+
void handle (pretty_printer *pp) FINAL OVERRIDE;
deferred_printed_type m_type_a;
pp_set_prefix (this, NULL);
}
+/* Copy constructor for pretty_printer. */
+
+pretty_printer::pretty_printer (const pretty_printer &other)
+: buffer (new (XCNEW (output_buffer)) output_buffer ()),
+ prefix (),
+ padding (other.padding),
+ maximum_length (other.maximum_length),
+ indent_skip (other.indent_skip),
+ wrapping (other.wrapping),
+ format_decoder (other.format_decoder),
+ m_format_postprocessor (NULL),
+ emitted_prefix (other.emitted_prefix),
+ need_newline (other.need_newline),
+ translate_identifiers (other.translate_identifiers),
+ show_color (other.show_color),
+ show_urls (other.show_urls)
+{
+ pp_line_cutoff (this) = maximum_length;
+ /* By default, we emit prefixes once per message. */
+ pp_prefixing_rule (this) = pp_prefixing_rule (&other);
+ pp_set_prefix (this, NULL);
+
+ if (other.m_format_postprocessor)
+ m_format_postprocessor = other.m_format_postprocessor->clone ();
+}
+
pretty_printer::~pretty_printer ()
{
if (m_format_postprocessor)
free (prefix);
}
+/* Base class implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+pretty_printer::clone () const
+{
+ return new pretty_printer (*this);
+}
+
/* Append a string delimited by START and END to the output area of
PRETTY-PRINTER. No line wrapping is done. However, if beginning a
new line then emit PRETTY-PRINTER's prefix and skip any leading
{
public:
virtual ~format_postprocessor () {}
+ virtual format_postprocessor *clone() const = 0;
virtual void handle (pretty_printer *) = 0;
};
/* Default construct a pretty printer with specified
maximum line length cut off limit. */
explicit pretty_printer (int = 0);
+ explicit pretty_printer (const pretty_printer &other);
virtual ~pretty_printer ();
+ virtual pretty_printer *clone () const;
+
/* Where we print external representation of ENTITY. */
output_buffer *buffer;