From patchwork Mon Dec 13 14:58:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 48873 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3F82E3858004 for ; Mon, 13 Dec 2021 14:58:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3F82E3858004 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1639407526; bh=XgCb0lgLdW/aiv5FbpZg9c0p+5r9tD8UN9SDnNDSgUM=; h=Date:Subject:To:References:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=GTkSk3ZkzYjGX6u4xUWdD1ETTblft02p94wW5uw2Y2ZX7/mcp07YBT2sH0KWnO3A+ lPoZYJ1g7VvMl7v5fVh44Y+lDC1GgeUGPsP6JSYpis3Lkzs8rZ1ymbI5K6F5OG02oY voeFZfuhIgt/broWQ8eivcCw3+FA7szt09SK3gZs= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 872233858D39 for ; Mon, 13 Dec 2021 14:58:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 872233858D39 Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-542-tLzKLXQgNUiJshRlJm0UuA-1; Mon, 13 Dec 2021 09:58:14 -0500 X-MC-Unique: tLzKLXQgNUiJshRlJm0UuA-1 Received: by mail-qv1-f69.google.com with SMTP id jn10-20020ad45dea000000b003bd74c93df4so24016865qvb.15 for ; Mon, 13 Dec 2021 06:58:14 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to; bh=K1JHfI94m6vM6JEM3m1BrEo3ALCjt+f0aDF1FdWuVII=; b=dH6Uo5GD49xRQrT3HxP16yiF7Ui6sv8+ndm2+8lvtspDEaXveGiRyOWohQMLF5H/n3 tAUf7Ghs8A2KfAJhrwk3LAzymHnUcuybkHX4QSbc8zooNCRv4Eoca+8srpO9YAzwixyS +SRiSBwe0xBJ++9u16ENUbq+q8tWKZjVBoP6x/HJMLMdw96rBP6K3ILMI4csTUBXCZoM ZLZ6dmw+HbdruasCOTIWqwRspE0DO2RMqrZ1PZCgMCeNFEVatxb537xlhXDuHFOx1wXz INFG44YZjTtsvU3+vGgeB+gpV8k7VQ5jM0thKYFeyAFSEANLHcBfwWdu22+saEffoDlI bhqQ== X-Gm-Message-State: AOAM532QBdPJIYfVo47C8HRIJxsOyVGSH/YJqoYp7ae/TgG5Idp6hx8F 4jN5+h5Z6+CqXqUvdgEOug15hnZP9+eRhScTmlMFyyN/RP3NDiFNasbzwTNSRNvrLmgPsecO2Oh 9m/EMKvrmkMpkzMh/Cg== X-Received: by 2002:a05:620a:4305:: with SMTP id u5mr32805402qko.577.1639407493722; Mon, 13 Dec 2021 06:58:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJxkWI7kv+NkdXjxUKyh3d15sSoh60BsUbOtnDISti/t/8dGQs2O6mPZmMWM5a/Rsyi/HU8yLw== X-Received: by 2002:a05:620a:4305:: with SMTP id u5mr32805374qko.577.1639407493351; Mon, 13 Dec 2021 06:58:13 -0800 (PST) Received: from [192.168.1.149] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id br43sm6024365qkb.57.2021.12.13.06.58.11 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 13 Dec 2021 06:58:12 -0800 (PST) Message-ID: Date: Mon, 13 Dec 2021 09:58:11 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.4.0 Subject: [PATCH v2 RFC] c++: add color to function decl printing To: Jonathan Wakely References: <20211212053942.240160-1-jason@redhat.com> In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jason Merrill via Gcc-patches From: Jason Merrill Reply-To: Jason Merrill Cc: gcc Patches Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" On 12/13/21 06:02, Jonathan Wakely wrote: > On Sun, 12 Dec 2021 at 05:39, Jason Merrill > wrote: > > > > In reading C++ diagnostics, it's often hard to find the name of the > function > > in the middle of the template header, return type, parameters, and > template > > arguments.  So let's colorize it, and maybe the template argument > bindings > > while we're at it. > > > > I've somewhat arbitrarily chosen bold green for the function name, and > > non-bold magenta for the template arguments.  I'm not at all attached to > > these choices. > > > > A side-effect is that when this happens in a quote (i.e. %qD), the > > rest of the quote after the function name is no longer bold.  I think > that's > > acceptable; returning to the bold would require maintaining a > colorize stack > > instead of the on/off controls we have now. > > > > Any thoughts? > > I thought I was going to love this ... and it's a nice little > improvement, but I didn't love it as much as I expected. > > Is it intentional that only the last function in the instantiation stack > gets colourized? In this example the function on line 390 isn't highlighted: > > /home/jwakely/gcc/12/include/c++/12.0.0/bits/ranges_base.h:390:12:  required > by substitution of 'template  requires > (is_bounded_array_v::type>) || > (__member_size*<_Tp>) || (__adl_size<_Tp>) || (__sentinel_size<_Tp>) > constexpr auto std::ranges::__cust_access::_Size::operator()(_Tp&&) > const [with _Tp = adl::Footie (&)[]]*' Oops, I needed to change subst_to_string as well. Updated patch below. > Aside: it's a little odd that the first caret diagnostic there only > highlights the word "operator" and not the name of the function, > "operator()". Yes, I imagine we need to adjust DECL_SOURCE_LOCATION to use a range instead of assuming the location of the first token is sufficient. Jason From b6050ea38d01374e1c18809f4b5ff6f7d302a122 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 18 Jun 2021 05:45:02 -0400 Subject: [PATCH] c++: add color to function decl printing To: gcc-patches@gcc.gnu.org In reading C++ diagnostics, it's often hard to find the name of the function in the middle of the template header, return type, parameters, and template arguments. So let's colorize it, and maybe the template argument bindings while we're at it. I've somewhat arbitrarily chosen bold green for the function name, and non-bold magenta for the template arguments. A side-effect of this is that when this happens in a quote (i.e. %qD), the rest of the quote after the function name is no longer bold. I think that's acceptable; returning to the bold would require maintaining a colorize stack instead of the on/off controls we have now. gcc/cp/ChangeLog: * error.c (decl_to_string): Add show_color parameter. (subst_to_string): Likewise. (cp_printer): Pass it. (type_to_string): Set pp_show_color. (dump_function_name): Use "fnname" color. (dump_template_bindings): Use "targs" color. (struct colorize_guard): New. (reinit_cxx_pp): Clear pp_show_color. (cp_print_error_function): Use %qD. (function_category): Use %qD. gcc/ChangeLog: * diagnostic-color.c: Add fnname and targs color entries. * doc/invoke.texi: Document them. --- gcc/doc/invoke.texi | 8 +++++ gcc/cp/error.c | 70 ++++++++++++++++++++++++++++++------------ gcc/diagnostic-color.c | 2 ++ 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9b4371b9213..cdfddd75343 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -4803,6 +4803,14 @@ SGR substring for location information, @samp{file:line} or @vindex quote GCC_COLORS @r{capability} SGR substring for information printed within quotes. +@item fnname= +@vindex fnname GCC_COLORS @r{capability} +SGR substring for names of C++ functions. + +@item targs= +@vindex targs GCC_COLORS @r{capability} +SGR substring for C++ function template parameter bindings. + @item fixit-insert= @vindex fixit-insert GCC_COLORS @r{capability} SGR substring for fix-it hints suggesting text to diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 323643d1e6f..0008ee2ee8d 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1,4 +1,4 @@ -/* Call-backs for C++ error reporting. +/* Call-backs for -*- C++ -*- error reporting. This code is non-reentrant. Copyright (C) 1993-2021 Free Software Foundation, Inc. This file is part of GCC. @@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see #include "cp-tree.h" #include "stringpool.h" #include "tree-diagnostic.h" +#include "diagnostic-color.h" #include "langhooks-def.h" #include "intl.h" #include "cxx-pretty-print.h" @@ -56,7 +57,7 @@ static cxx_pretty_printer * const cxx_pp = &actual_pretty_printer; static const char *args_to_string (tree, int); static const char *code_to_string (enum tree_code); static const char *cv_to_string (tree, int); -static const char *decl_to_string (tree, int); +static const char *decl_to_string (tree, int, bool); static const char *fndecl_to_string (tree, int); static const char *op_to_string (bool, enum tree_code); static const char *parm_to_string (int); @@ -390,6 +391,7 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args, else { pp_cxx_whitespace (pp); + pp_string (pp, colorize_start (pp_show_color (pp), "targs")); pp_cxx_left_bracket (pp); pp->translate_string ("with"); pp_cxx_whitespace (pp); @@ -400,7 +402,10 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args, ~prepost_semicolon () { if (need_semicolon) - pp_cxx_right_bracket (pp); + { + pp_cxx_right_bracket (pp); + pp_string (pp, colorize_stop (pp_show_color (pp))); + } } } semicolon_or_introducer = {pp, false}; @@ -1158,6 +1163,22 @@ dump_simple_decl (cxx_pretty_printer *pp, tree t, tree type, int flags) dump_type_suffix (pp, type, flags); } +struct colorize_guard +{ + bool colorize; + cxx_pretty_printer *pp; + + colorize_guard (bool _colorize, cxx_pretty_printer *pp, const char *name) + : colorize (_colorize && pp_show_color (pp)), pp (pp) + { + pp_string (pp, colorize_start (colorize, name)); + } + ~colorize_guard () + { + pp_string (pp, colorize_stop (colorize)); + } +}; + /* Print an IDENTIFIER_NODE that is the name of a declaration. */ static void @@ -1928,6 +1949,11 @@ dump_exception_spec (cxx_pretty_printer *pp, tree t, int flags) static void dump_function_name (cxx_pretty_printer *pp, tree t, int flags) { + bool colorize = flags & (TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE + | TFF_TEMPLATE_HEADER); + + colorize_guard g (colorize, pp, "fnname"); + tree name = DECL_NAME (t); /* We can get here with a decl that was synthesized by language- @@ -3062,6 +3088,7 @@ reinit_cxx_pp (void) cxx_pp->padding = pp_none; pp_indentation (cxx_pp) = 0; pp_needs_newline (cxx_pp) = false; + pp_show_color (cxx_pp) = false; cxx_pp->enclosing_scope = current_function_decl; } @@ -3208,7 +3235,7 @@ location_of (tree t) function. */ static const char * -decl_to_string (tree decl, int verbose) +decl_to_string (tree decl, int verbose, bool show_color) { int flags = 0; @@ -3222,6 +3249,7 @@ decl_to_string (tree decl, int verbose) flags |= TFF_TEMPLATE_HEADER; reinit_cxx_pp (); + pp_show_color (cxx_pp) = show_color; dump_decl (cxx_pp, decl, flags); return pp_ggc_formatted_text (cxx_pp); } @@ -3321,6 +3349,7 @@ type_to_string (tree typ, int verbose, bool postprocessed, bool *quote, flags |= TFF_TEMPLATE_HEADER; reinit_cxx_pp (); + pp_show_color (cxx_pp) = show_color; if (postprocessed && quote && *quote) pp_begin_quote (cxx_pp, show_color); @@ -3415,7 +3444,7 @@ args_to_string (tree p, int verbose) arguments. */ static const char * -subst_to_string (tree p) +subst_to_string (tree p, bool show_color) { tree decl = TREE_PURPOSE (p); tree targs = TREE_VALUE (p); @@ -3427,6 +3456,7 @@ subst_to_string (tree p) return ""; reinit_cxx_pp (); + pp_show_color (cxx_pp) = show_color; dump_template_decl (cxx_pp, TREE_PURPOSE (p), flags); dump_substitution (cxx_pp, NULL, tparms, targs, /*flags=*/0); return pp_ggc_formatted_text (cxx_pp); @@ -3517,7 +3547,7 @@ cp_print_error_function (diagnostic_context *context, fndecl = current_function_decl; pp_printf (context->printer, function_category (fndecl), - cxx_printable_name_translate (fndecl, 2)); + fndecl); while (abstract_origin) { @@ -3561,19 +3591,19 @@ cp_print_error_function (diagnostic_context *context, { if (context->show_column && s.column != 0) pp_printf (context->printer, - _(" inlined from %qs at %r%s:%d:%d%R"), - cxx_printable_name_translate (fndecl, 2), + _(" inlined from %qD at %r%s:%d:%d%R"), + fndecl, "locus", s.file, s.line, s.column); else pp_printf (context->printer, - _(" inlined from %qs at %r%s:%d%R"), - cxx_printable_name_translate (fndecl, 2), + _(" inlined from %qD at %r%s:%d%R"), + fndecl, "locus", s.file, s.line); } else - pp_printf (context->printer, _(" inlined from %qs"), - cxx_printable_name_translate (fndecl, 2)); + pp_printf (context->printer, _(" inlined from %qD"), + fndecl); } } pp_character (context->printer, ':'); @@ -3598,20 +3628,20 @@ function_category (tree fn) && DECL_FUNCTION_MEMBER_P (fn)) { if (DECL_STATIC_FUNCTION_P (fn)) - return _("In static member function %qs"); + return _("In static member function %qD"); else if (DECL_COPY_CONSTRUCTOR_P (fn)) - return _("In copy constructor %qs"); + return _("In copy constructor %qD"); else if (DECL_CONSTRUCTOR_P (fn)) - return _("In constructor %qs"); + return _("In constructor %qD"); else if (DECL_DESTRUCTOR_P (fn)) - return _("In destructor %qs"); + return _("In destructor %qD"); else if (LAMBDA_FUNCTION_P (fn)) return _("In lambda function"); else - return _("In member function %qs"); + return _("In member function %qD"); } else - return _("In function %qs"); + return _("In function %qD"); } /* Disable warnings about missing quoting in GCC diagnostics for @@ -4393,7 +4423,7 @@ cp_printer (pretty_printer *pp, text_info *text, const char *spec, break; } } - result = decl_to_string (temp, verbose); + result = decl_to_string (temp, verbose, pp_show_color (pp)); } break; case 'E': result = expr_to_string (next_tree); break; @@ -4410,7 +4440,7 @@ cp_printer (pretty_printer *pp, text_info *text, const char *spec, case 'O': result = op_to_string (false, next_tcode); break; case 'P': result = parm_to_string (next_int); break; case 'Q': result = op_to_string (true, next_tcode); break; - case 'S': result = subst_to_string (next_tree); break; + case 'S': result = subst_to_string (next_tree, pp_show_color (pp)); break; case 'T': { result = type_to_string (next_tree, verbose, false, quoted, diff --git a/gcc/diagnostic-color.c b/gcc/diagnostic-color.c index 1fc5a9079c7..c1406b45d8b 100644 --- a/gcc/diagnostic-color.c +++ b/gcc/diagnostic-color.c @@ -91,6 +91,8 @@ static struct color_cap color_dict[] = { "locus", SGR_SEQ (COLOR_BOLD), 5, false }, { "quote", SGR_SEQ (COLOR_BOLD), 5, false }, { "path", SGR_SEQ (COLOR_BOLD COLOR_SEPARATOR COLOR_FG_CYAN), 4, false }, + { "fnname", SGR_SEQ (COLOR_BOLD COLOR_SEPARATOR COLOR_FG_GREEN), 6, false }, + { "targs", SGR_SEQ (COLOR_FG_MAGENTA), 5, false }, { "fixit-insert", SGR_SEQ (COLOR_FG_GREEN), 12, false }, { "fixit-delete", SGR_SEQ (COLOR_FG_RED), 12, false }, { "diff-filename", SGR_SEQ (COLOR_BOLD), 13, false }, -- 2.27.0