From d723bb7c757e0d7d94df7b059f52ad50a2175c50 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Manuel=20L=C3=B3pez-Ib=C3=A1=C3=B1ez?= Date: Sun, 26 Oct 2014 21:21:58 +0000 Subject: [PATCH] In cp/error.c... MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In cp/error.c, I separate the initialization of the diagnostic context from the initialization of the scratch pretty-printer (cxx_pp). This was suggested by Gabriel in the last review of the patch and now I realize it was a good idea. Now cxx_initialize_diagnostics is the equivalent version of c_initialize_diagnostics. To avoid having to make extern a bunch of functions, I moved it from cp-objcp-common.c to error.c. I moved the setting of diagnostic_format_decoder (global_dc) = c_tree_printer, from c_objc_common_init to c_initialize_diagnostics, and right after c_common_diagnostics_set_defaults. This mimics what is done in cxx_initialize_diagnostics. Moreover, in both c_initialize_diagnostics and cxx_initialize_diagnostics, the FE-specific pretty-printer is initialized first and then other settings are applied. This does not make a difference right now, but if in the future one wishes to touch something in the pretty-printer, it will not get overriden immediately. In fact, the code I removed in c_common_initialize_diagnostics, which sets line_cutoff to 80, is useless because the pretty-printer created here is actually never used, but overriden by the FE-specific pretty-printers. This also means that doc/invoke.texi was wrong. Finally, it is useless to set the maximum line length to 0 in the constructor of cxx_pretty_printer. It is the default anyway. gcc/c/ChangeLog: 2014-10-26 Manuel López-Ibáñez PR c++/53061 * c-objc-common.c (c_objc_common_init): Do not do diagnostics initialization here... (c_initialize_diagnostics): ... but here. Set defaults after building pretty-printer. gcc/ChangeLog: 2014-10-26 Manuel López-Ibáñez PR c++/53061 * doc/invoke.texi (fmessage-length): Update text to match reality. gcc/cp/ChangeLog: 2014-10-26 Manuel López-Ibáñez PR c++/53061 * cp-objcp-common.c: Do not include new. (cxx_initialize_diagnostics): Move from here to ... * error.c (cxx_initialize_diagnostics): : ... here. Move diagnostics initialization here from init_error. (cxx_pp): Use a real pointer not a macro. (init_error): Just initialize cxx_pp. * cxx-pretty-print.c (cxx_pretty_printer::cxx_pretty_printer): Do not set maximum line length. gcc/c-family/ChangeLog: 2014-10-26 Manuel López-Ibáñez PR c++/53061 * c-opts.c (c_common_diagnostics_set_defaults): Renamed from c_common_initialize_diagnostics. * c-common.h: Likewise. From-SVN: r216720 --- gcc/ChangeLog | 5 +++++ gcc/c-family/ChangeLog | 7 +++++++ gcc/c-family/c-common.h | 2 +- gcc/c-family/c-opts.c | 15 ++------------- gcc/c/ChangeLog | 8 ++++++++ gcc/c/c-objc-common.c | 15 ++++----------- gcc/cp/ChangeLog | 12 ++++++++++++ gcc/cp/cp-objcp-common.c | 18 ------------------ gcc/cp/cxx-pretty-print.c | 2 -- gcc/cp/error.c | 40 ++++++++++++++++++++++++++++++++------- gcc/doc/invoke.texi | 9 ++++----- 11 files changed, 76 insertions(+), 57 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b67d906bac5..cfcba31de95 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-10-26 Manuel López-Ibáñez + + PR c++/53061 + * doc/invoke.texi (fmessage-length): Update text to match reality. + 2014-10-26 Richard Sandiford * config/microblaze/microblaze.c: Include rtl-iter.h. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index fb0e63bc7b4..9735625eee1 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2014-10-26 Manuel López-Ibáñez + + PR c++/53061 + * c-opts.c (c_common_diagnostics_set_defaults): Renamed from + c_common_initialize_diagnostics. + * c-common.h: Likewise. + 2014-10-24 Marek Polacek PR c/56980 diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index b45ccfce35b..dcd52fb010c 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -845,7 +845,7 @@ extern tree build_va_arg (location_t, tree, tree); extern const unsigned int c_family_lang_mask; extern unsigned int c_common_option_lang_mask (void); -extern void c_common_initialize_diagnostics (diagnostic_context *); +extern void c_common_diagnostics_set_defaults (diagnostic_context *); extern bool c_common_complain_wrong_lang_p (const struct cl_option *); extern void c_common_init_options_struct (struct gcc_options *); extern void c_common_init_options (unsigned int, struct cl_decoded_option *); diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 448eb3e8b74..000fdd2bd52 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -178,21 +178,10 @@ c_diagnostic_finalizer (diagnostic_context *context, pp_newline_and_flush (context->printer); } -/* Common diagnostics initialization. */ +/* Common default settings for diagnostics. */ void -c_common_initialize_diagnostics (diagnostic_context *context) +c_common_diagnostics_set_defaults (diagnostic_context *context) { - /* This is conditionalized only because that is the way the front - ends used to do it. Maybe this should be unconditional? */ - if (c_dialect_cxx ()) - { - /* By default wrap lines at 80 characters. Is getenv - ("COLUMNS") preferable? */ - diagnostic_line_cutoff (context) = 80; - /* By default, emit location information once for every - diagnostic message. */ - diagnostic_prefixing_rule (context) = DIAGNOSTICS_SHOW_PREFIX_ONCE; - } diagnostic_finalizer (context) = c_diagnostic_finalizer; context->opt_permissive = OPT_fpermissive; } diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 9b6c1d58558..35d9ceed23b 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,11 @@ +2014-10-26 Manuel López-Ibáñez + + PR c++/53061 + * c-objc-common.c (c_objc_common_init): Do not do diagnostics + initialization here... + (c_initialize_diagnostics): ... but here. Set defaults after + building pretty-printer. + 2014-10-23 Marek Polacek PR c/63626 diff --git a/gcc/c/c-objc-common.c b/gcc/c/c-objc-common.c index 73bb297d423..12db5487894 100644 --- a/gcc/c/c-objc-common.c +++ b/gcc/c/c-objc-common.c @@ -62,15 +62,7 @@ c_objc_common_init (void) { c_init_decl_processing (); - if (c_common_init () == false) - return false; - - /* These were not defined in the Objective-C front end, but I'm - putting them here anyway. The diagnostic format decoder might - want an enhanced ObjC implementation. */ - diagnostic_format_decoder (global_dc) = &c_tree_printer; - - return true; + return c_common_init (); } /* Called during diagnostic message formatting process to print a @@ -186,8 +178,6 @@ has_c_linkage (const_tree decl ATTRIBUTE_UNUSED) void c_initialize_diagnostics (diagnostic_context *context) { - c_common_initialize_diagnostics (context); - pretty_printer *base = context->printer; c_pretty_printer *pp = XNEW (c_pretty_printer); context->printer = new (pp) c_pretty_printer (); @@ -195,6 +185,9 @@ c_initialize_diagnostics (diagnostic_context *context) /* It is safe to free this object because it was previously XNEW()'d. */ base->~pretty_printer (); XDELETE (base); + + c_common_diagnostics_set_defaults (context); + diagnostic_format_decoder (context) = &c_tree_printer; } int diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f741bfb6036..e105edca01e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2014-10-26 Manuel López-Ibáñez + + PR c++/53061 + * cp-objcp-common.c: Do not include new. + (cxx_initialize_diagnostics): Move from here to ... + * error.c (cxx_initialize_diagnostics): : ... here. Move + diagnostics initialization here from init_error. + (cxx_pp): Use a real pointer not a macro. + (init_error): Just initialize cxx_pp. + * cxx-pretty-print.c (cxx_pretty_printer::cxx_pretty_printer): Do + not set maximum line length. + 2014-10-23 Jonathan Wakely PR c++/63619 diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index 0d144ef0ba7..12df4c2667f 100644 --- a/gcc/cp/cp-objcp-common.c +++ b/gcc/cp/cp-objcp-common.c @@ -32,8 +32,6 @@ along with GCC; see the file COPYING3. If not see #include "cxx-pretty-print.h" #include "cp-objcp-common.h" -#include // For placement new. - /* Special routine to get the alias set for C++. */ alias_set_type @@ -132,22 +130,6 @@ cp_var_mod_type_p (tree type, tree fn) return false; } -/* Construct a C++-aware pretty-printer for CONTEXT. It is assumed - that CONTEXT->printer is an already constructed basic pretty_printer. */ -void -cxx_initialize_diagnostics (diagnostic_context *context) -{ - c_common_initialize_diagnostics (context); - - pretty_printer *base = context->printer; - cxx_pretty_printer *pp = XNEW (cxx_pretty_printer); - context->printer = new (pp) cxx_pretty_printer (); - - /* It is safe to free this object because it was previously XNEW()'d. */ - base->~pretty_printer (); - XDELETE (base); -} - /* This compares two types for equivalence ("compatible" in C-based languages). This routine should only return 1 if it is sure. It should not be used in contexts where erroneously returning 0 causes problems. */ diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index 67e84c0a240..02ce34611b3 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -2433,8 +2433,6 @@ cxx_pretty_printer::cxx_pretty_printer () : c_pretty_printer (), enclosing_scope (global_namespace) { - pp_set_line_maximum_length (this, 0); - type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq; parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause; } diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 57f3c31972d..755bb00f71b 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -39,11 +39,13 @@ along with GCC; see the file COPYING3. If not see #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',') #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';') -/* The global buffer where we dump everything. It is there only for - transitional purpose. It is expected, in the near future, to be - completely removed. */ +/* cxx_pp is a C++ front-end-specific pretty printer: this is where we + dump C++ ASTs as strings. It is mostly used only by the various + tree -> string functions that are occasionally called from the + debugger or by the front-end for things like + __PRETTY_FUNCTION__. */ static cxx_pretty_printer scratch_pretty_printer; -#define cxx_pp (&scratch_pretty_printer) +static cxx_pretty_printer * cxx_pp = &scratch_pretty_printer; /* Translate if being used for diagnostics, but not for dump files or __PRETTY_FUNCTION. */ @@ -104,13 +106,37 @@ static void cp_print_error_function (diagnostic_context *, diagnostic_info *); static bool cp_printer (pretty_printer *, text_info *, const char *, int, bool, bool, bool); +/* CONTEXT->printer is a basic pretty printer that was constructed + presumably by diagnostic_initialize(), called early in the + compiler's initialization process (in general_init) Before the FE + is initialized. This (C++) FE-specific diagnostic initializer is + thus replacing the basic pretty printer with one that has C++-aware + capacities. */ + void -init_error (void) +cxx_initialize_diagnostics (diagnostic_context *context) { - diagnostic_starter (global_dc) = cp_diagnostic_starter; + pretty_printer *base = context->printer; + cxx_pretty_printer *pp = XNEW (cxx_pretty_printer); + context->printer = new (pp) cxx_pretty_printer (); + + /* It is safe to free this object because it was previously XNEW()'d. */ + base->~pretty_printer (); + XDELETE (base); + + c_common_diagnostics_set_defaults (context); + diagnostic_starter (context) = cp_diagnostic_starter; /* diagnostic_finalizer is already c_diagnostic_finalizer. */ - diagnostic_format_decoder (global_dc) = cp_printer; + diagnostic_format_decoder (context) = cp_printer; +} +/* Initialize the global cxx_pp that is used as the memory store for + the string representation of C++ AST. See the description of + cxx_pp above. */ + +void +init_error (void) +{ new (cxx_pp) cxx_pretty_printer (); } diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9c68aebe6d2..9f21c9623a9 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -3078,11 +3078,10 @@ honor these options. @table @gcctabopt @item -fmessage-length=@var{n} @opindex fmessage-length -Try to format error messages so that they fit on lines of about @var{n} -characters. The default is 72 characters for @command{g++} and 0 for the rest of -the front ends supported by GCC@. If @var{n} is zero, then no -line-wrapping is done; each error message appears on a single -line. +Try to format error messages so that they fit on lines of about +@var{n} characters. If @var{n} is zero, then no line-wrapping will be +done; each error message will appear on a single line. This is the +default for all front ends. @item -fdiagnostics-show-location=once @opindex fdiagnostics-show-location -- 2.30.2