public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Patrick Palka <ppalka@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r15-4] c++: fix source printing for "required from here" message
Date: Fri, 26 Apr 2024 11:44:51 +0000 (GMT)	[thread overview]
Message-ID: <20240426114451.2CF3A3858C42@sourceware.org> (raw)

https://gcc.gnu.org/g:7d5479a2ecf6309281de10b747a7423169a2ff95

commit r15-4-g7d5479a2ecf6309281de10b747a7423169a2ff95
Author: Patrick Palka <ppalka@redhat.com>
Date:   Fri Apr 26 07:44:25 2024 -0400

    c++: fix source printing for "required from here" message
    
    It seems the diagnostic machinery's source line printing respects
    the pretty printer prefix, but this is undesirable for the call to
    diagnostic_show_locus in print_instantiation_partial_context_line
    (added in r14-4388-g1c45319b66edc9) since the prefix may have been
    set when issuing an earlier, unrelated diagnostic and we just want
    to print an unprefixed source line.
    
    This patch naively fixes this by clearing the prefix before calling
    diagnostic_show_locus.
    
    Before this patch, for error60a.C below we'd print
    
    gcc/testsuite/g++.dg/template/error60a.C: In function ‘void usage()’:
    gcc/testsuite/g++.dg/template/error60a.C:24:3: error: ‘unrelated_error’ was not declared in this scope
       24 |   unrelated_error; // { dg-error "not declared" }
          |   ^~~~~~~~~~~~~~~
    gcc/testsuite/g++.dg/template/error60a.C: In instantiation of ‘void test(Foo) [with Foo = int]’:
    gcc/testsuite/g++.dg/template/error60a.C:25:13:   required from here
    gcc/testsuite/g++.dg/template/error60a.C:24:3: error:    25 |   test<int> (42); // { dg-message " required from here" }
    gcc/testsuite/g++.dg/template/error60a.C:24:3: error:       |   ~~~~~~~~~~^~~~
    gcc/testsuite/g++.dg/template/error60a.C:19:24: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
       19 |   my_pointer<Foo> ptr (val); // { dg-error "invalid conversion from 'int' to 'int\\*'" }
          |                        ^~~
          |                        |
          |                        int
    gcc/testsuite/g++.dg/template/error60a.C:9:20: note:   initializing argument 1 of ‘my_pointer<Foo>::my_pointer(Foo*) [with Foo = int]’
        9 |   my_pointer (Foo *ptr) // { dg-message " initializing argument 1" }
          |               ~~~~~^~~
    
    and afterward we print
    
    gcc/testsuite/g++.dg/template/error60a.C: In function ‘void usage()’:
    gcc/testsuite/g++.dg/template/error60a.C:24:3: error: ‘unrelated_error’ was not declared in this scope
       24 |   unrelated_error; // { dg-error "not declared" }
          |   ^~~~~~~~~~~~~~~
    gcc/testsuite/g++.dg/template/error60a.C: In instantiation of ‘void test(Foo) [with Foo = int]’:
    gcc/testsuite/g++.dg/template/error60a.C:25:13:   required from here
       25 |   test<int> (42); // { dg-message " required from here" }
          |   ~~~~~~~~~~^~~~
    gcc/testsuite/g++.dg/template/error60a.C:19:24: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
       19 |   my_pointer<Foo> ptr (val); // { dg-error "invalid conversion from 'int' to 'int\\*'" }
          |                        ^~~
          |                        |
          |                        int
    gcc/testsuite/g++.dg/template/error60a.C:9:20: note:   initializing argument 1 of ‘my_pointer<Foo>::my_pointer(Foo*) [with Foo = int]’
        9 |   my_pointer (Foo *ptr) // { dg-message " initializing argument 1" }
          |               ~~~~~^~~
    
    gcc/cp/ChangeLog:
    
            * error.cc (print_instantiation_partial_context_line): Clear the
            pretty printer prefix around the call to diagnostic_show_locus.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/concepts/diagnostic2.C: Expect source line printed
            for the "required from here" message.
            * g++.dg/template/error60a.C: New test.

Diff:
---
 gcc/cp/error.cc                             |  2 ++
 gcc/testsuite/g++.dg/concepts/diagnostic2.C |  6 +++-
 gcc/testsuite/g++.dg/template/error60a.C    | 46 +++++++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc
index 7074845154e..37987ccb570 100644
--- a/gcc/cp/error.cc
+++ b/gcc/cp/error.cc
@@ -3793,7 +3793,9 @@ print_instantiation_partial_context_line (diagnostic_context *context,
 		   : _("required from here\n"));
     }
   gcc_rich_location rich_loc (loc);
+  char *saved_prefix = pp_take_prefix (context->printer);
   diagnostic_show_locus (context, &rich_loc, DK_NOTE);
+  pp_set_prefix (context->printer, saved_prefix);
 }
 
 /* Same as print_instantiation_full_context but less verbose.  */
diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic2.C b/gcc/testsuite/g++.dg/concepts/diagnostic2.C
index 6550ed6b3bd..d6f5872de2c 100644
--- a/gcc/testsuite/g++.dg/concepts/diagnostic2.C
+++ b/gcc/testsuite/g++.dg/concepts/diagnostic2.C
@@ -23,7 +23,11 @@ void
 baz()
 {
   bar<int>(); // { dg-error "no match" }
-/* { dg-begin-multiline-output "" }
+/* { dg-begin-multiline-output "for no match error" }
+   bar<int>();
+   ~~~~~~~~^~
+   { dg-end-multiline-output "" } */
+/* { dg-begin-multiline-output "for required from here message" }
    bar<int>();
    ~~~~~~~~^~
    { dg-end-multiline-output "" } */
diff --git a/gcc/testsuite/g++.dg/template/error60a.C b/gcc/testsuite/g++.dg/template/error60a.C
new file mode 100644
index 00000000000..9d0f170c18b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/error60a.C
@@ -0,0 +1,46 @@
+// A version of error60.C that first issues an unrelated error
+// to cause the pretty printer prefix to get set, verifying we
+// still print the source line for the "required from here"
+// message correctly in that case.
+// { dg-options "-fdiagnostics-show-caret" }
+
+template <typename Foo>
+struct my_pointer
+{
+  my_pointer (Foo *ptr) // { dg-message " initializing argument 1" }
+  : m_ptr (ptr)
+  {}
+
+  Foo *m_ptr;
+};
+
+template <typename Foo>
+void test (Foo val)
+{
+  my_pointer<Foo> ptr (val); // { dg-error "invalid conversion from 'int' to 'int\\*'" }
+}
+
+void usage ()
+{
+  unrelated_error; // { dg-error "not declared" }
+  test<int> (42); // { dg-message " required from here" }
+  /* { dg-begin-multiline-output "" }
+   unrelated_error;
+   ^~~~~~~~~~~~~~~
+     { dg-end-multiline-output "" } */
+  /* { dg-begin-multiline-output "" }
+   test<int> (42);
+   ~~~~~~~~~~^~~~
+     { dg-end-multiline-output "" } */
+}
+
+  /* { dg-begin-multiline-output "" }
+   my_pointer (Foo *ptr)
+               ~~~~~^~~
+     { dg-end-multiline-output "" } */
+  /* { dg-begin-multiline-output "" }
+   my_pointer<Foo> ptr (val);
+                        ^~~
+                        |
+                        int
+     { dg-end-multiline-output "" } */

                 reply	other threads:[~2024-04-26 11:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240426114451.2CF3A3858C42@sourceware.org \
    --to=ppalka@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).