diff mbox series

Replace one error with inform.

Message ID 8b810d0c-142f-0048-1674-4a7d0ca6d956@suse.cz
State New
Headers show
Series Replace one error with inform. | expand

Commit Message

Martin Liška Jan. 27, 2020, 9:57 a.m. UTC
Hello.

The patch is about splitting pair of errors into
error and inform which seems logical to me in this
situation:

/xg++ -B. /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/vt-34314.C
/home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/vt-34314.C:3:24: error: template parameter ‘class ... Args’
     3 | template<typename Fun, typename... Args> // { dg-error "template parameter" }
       |                        ^~~~~~~~
/home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/vt-34314.C:7:8: note: redeclared here as ‘class Arg0’
     7 | struct call // { dg-message "note: redeclared here" }
       |        ^~~~

instead of:

g++ /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/vt-34314.C -c
/home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/vt-34314.C:3:24: error: template parameter ‘class ... Args’
     3 | template<typename Fun, typename... Args> // { dg-error "template parameter" }
       |                        ^~~~~~~~
/home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/vt-34314.C:7:8: error: redeclared here as ‘class Arg0’
     7 | struct call // { dg-message "note: redeclared here" }
       |        ^~~~

That helps -fmax-errors=1 to not split the error in the middle.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/cp/ChangeLog:

2020-01-23  Martin Liska  <mliska@suse.cz>

	PR c++/92440
	* pt.c (redeclare_class_template): Use inform
	for the second location.

gcc/testsuite/ChangeLog:

2020-01-23  Martin Liska  <mliska@suse.cz>

	PR c++/92440
	* g++.dg/template/pr92440.C: New test.
	* g++.dg/cpp0x/vt-34314.C: Update error to note.
	* g++.dg/template/pr59930-2.C: Likewise.
	* g++.old-deja/g++.pt/redecl1.C: Likewise.
---
  gcc/cp/pt.c                                 |  2 +-
  gcc/testsuite/g++.dg/cpp0x/vt-34314.C       |  6 +++---
  gcc/testsuite/g++.dg/template/pr59930-2.C   |  2 +-
  gcc/testsuite/g++.dg/template/pr92440.C     | 10 ++++++++++
  gcc/testsuite/g++.dg/template/redecl2.C     |  2 +-
  gcc/testsuite/g++.old-deja/g++.pt/redecl1.C |  4 ++--
  6 files changed, 18 insertions(+), 8 deletions(-)
  create mode 100644 gcc/testsuite/g++.dg/template/pr92440.C

Comments

David Malcolm Jan. 27, 2020, 1:38 p.m. UTC | #1
On Mon, 2020-01-27 at 10:57 +0100, Martin Liška wrote:
> Hello.
> 
> The patch is about splitting pair of errors into
> error and inform which seems logical to me in this
> situation:

[...]

> diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
> index 4520c995028..f9bed1ea4fb 100644
> --- a/gcc/cp/pt.c
> +++ b/gcc/cp/pt.c
> @@ -6149,7 +6149,7 @@ redeclare_class_template (tree type, tree parms, tree cons)
>  		  != TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm)))))
>  	{

Please add an
          auto_diagnostic_group d;
here, so that -fdiagnostics-format=json can nest the note below the
error.

OK with that change.

Thanks
Dave

>  	  error ("template parameter %q+#D", tmpl_parm);
> -	  error ("redeclared here as %q#D", parm);
> +	  inform (input_location, "redeclared here as %q#D", parm);
>  	  return false;
>  	}
Martin Liška Jan. 27, 2020, 3:23 p.m. UTC | #2
On 1/27/20 2:38 PM, David Malcolm wrote:
> Please add an
>            auto_diagnostic_group d;
> here, so that -fdiagnostics-format=json can nest the note below the
> error.
> 
> OK with that change.

Sure, there's one another patch that does the for all error+inform
in the function.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin
David Malcolm Jan. 27, 2020, 3:28 p.m. UTC | #3
On Mon, 2020-01-27 at 16:23 +0100, Martin Liška wrote:
> On 1/27/20 2:38 PM, David Malcolm wrote:
> > Please add an
> >            auto_diagnostic_group d;
> > here, so that -fdiagnostics-format=json can nest the note below the
> > error.
> > 
> > OK with that change.
> 
> Sure, there's one another patch that does the for all error+inform
> in the function.
> 
> Patch can bootstrap on x86_64-linux-gnu and survives regression
> tests.
> 
> Ready to be installed?
> Thanks,
> Martin

LGTM, though a nit in the ChangeLog message: "couple of" to me means 2
and the number is 4, so "several" is probably better here.  [1] 

Thanks
Dave

[1] though I'm probably being overly pedantic; see 
https://xkcd.com/1070/
diff mbox series

Patch

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 4520c995028..f9bed1ea4fb 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -6149,7 +6149,7 @@  redeclare_class_template (tree type, tree parms, tree cons)
 		  != TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm)))))
 	{
 	  error ("template parameter %q+#D", tmpl_parm);
-	  error ("redeclared here as %q#D", parm);
+	  inform (input_location, "redeclared here as %q#D", parm);
 	  return false;
 	}
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34314.C b/gcc/testsuite/g++.dg/cpp0x/vt-34314.C
index ee0ed01b8d3..b37cac53223 100644
--- a/gcc/testsuite/g++.dg/cpp0x/vt-34314.C
+++ b/gcc/testsuite/g++.dg/cpp0x/vt-34314.C
@@ -4,7 +4,7 @@  template<typename Fun, typename... Args> // { dg-error "template parameter" }
 struct call;
 
 template<typename Fun, typename Arg0>
-struct call // { dg-error "redeclared here" }
+struct call // { dg-message "note: redeclared here" }
 {
     template<typename Sig>
     struct result;
@@ -21,7 +21,7 @@  template<typename Fun, int... N> // { dg-error "template parameter" }
 struct call2;
 
 template<typename Fun, int N>
-struct call2 // { dg-error "redeclared here" }
+struct call2 // { dg-message "note: redeclared here" }
 {
     template<typename Sig>
     struct result;
@@ -37,7 +37,7 @@  template<typename Fun, template<typename> class... TT> // { dg-error "template p
 struct call3;
 
 template<typename Fun, template<typename> class TT>
-struct call3 // { dg-error "redeclared here" }
+struct call3 // { dg-message "note: redeclared here" }
 {
     template<typename Sig>
     struct result;
diff --git a/gcc/testsuite/g++.dg/template/pr59930-2.C b/gcc/testsuite/g++.dg/template/pr59930-2.C
index a7e6ea4ea9a..65ec58e23f4 100644
--- a/gcc/testsuite/g++.dg/template/pr59930-2.C
+++ b/gcc/testsuite/g++.dg/template/pr59930-2.C
@@ -6,7 +6,7 @@  namespace N {
     // Injects N::N
     template < T > friend class N;
     // { dg-error "template parameter" "" { target *-*-* } .-1 }
-    // { dg-error "redeclared"  "" { target *-*-* } .-2 }
+    // { dg-message "note: redeclared"  "" { target *-*-* } .-2 }
   };
 }
 
diff --git a/gcc/testsuite/g++.dg/template/pr92440.C b/gcc/testsuite/g++.dg/template/pr92440.C
new file mode 100644
index 00000000000..20db5f10586
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr92440.C
@@ -0,0 +1,10 @@ 
+// PR c++/92440
+// { dg-do compile }
+
+template <int T> // { dg-error "template parameter" }
+struct S {
+    template <class U>
+    friend struct S;  // { dg-message "note: redeclared here as" }
+};
+
+S<0> s;
diff --git a/gcc/testsuite/g++.dg/template/redecl2.C b/gcc/testsuite/g++.dg/template/redecl2.C
index 4dd432e6fea..31334f4f334 100644
--- a/gcc/testsuite/g++.dg/template/redecl2.C
+++ b/gcc/testsuite/g++.dg/template/redecl2.C
@@ -6,4 +6,4 @@ 
 // non-type template parameter.
 
 template <int i> struct X;	// { dg-error "template parameter" }
-template <int* p> struct X;	// { dg-error "redeclared here" }
+template <int* p> struct X;	// { dg-message "note: redeclared here" }
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/redecl1.C b/gcc/testsuite/g++.old-deja/g++.pt/redecl1.C
index 4a580e17742..48517f5d1d3 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/redecl1.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/redecl1.C
@@ -16,7 +16,7 @@  template <class T> // { dg-error "template parameter" }
 struct S3;
 
 template <int I>
-struct S3; // { dg-error "redeclared here" } 
+struct S3; // { dg-message "note: redeclared here" } 
 
 template <template <class T> class C>
-struct S3; // { dg-error "redeclared here" } 
+struct S3; // { dg-message "note: redeclared here" }