diff mbox

[C++] One more error + error to error + inform and a subtler issue

Message ID 57608135.6050207@oracle.com
State New
Headers show

Commit Message

Paolo Carlini June 14, 2016, 10:12 p.m. UTC
Hi,

today I noticed the below while I was putting together another batch of 
minor diagnostic fixes. The error + error to error + inform change seems 
rather straightforward to me and as usual adds clarity to the diagnostic 
outputs (all the front-ends I have at hand either do something similar 
or do not output the inform part at all). However, there is a subtler 
issue. For example the first pair of errors we currently output for 
constexpr-specialization.C is the following (I'm removing original code 
and carets for clarity):

constexpr-specialization.C:7:26: error: redeclaration ‘constexpr int 
foo(T) [with T = int]’ differs in ‘constexpr’

constexpr-specialization.C:6:16: error: from previous declaration 
‘constexpr int foo(T) [with T = int]’

see? The pretty printing of the previous declaration is very misleading 
because it has constexpr in it! The same happens for the dual type of 
error. Now, I suppose we should investigate that a bit more, I don't 
think it's the first time we notice this, but I'm wondering if for the 
time being we could just apply something like the below, which just does 
away with the prettyprinting for the inform, just uses "previous 
declaration here", something that in any case we already do in a number 
of places...

Thanks,
Paolo.

/////////////////////

Comments

Jason Merrill June 15, 2016, 1:30 a.m. UTC | #1
On Tue, Jun 14, 2016 at 6:12 PM, Paolo Carlini <paolo.carlini@oracle.com> wrote:
> constexpr-specialization.C:7:26: error: redeclaration ‘constexpr int foo(T)
> [with T = int]’ differs in ‘constexpr’
>
> constexpr-specialization.C:6:16: error: from previous declaration ‘constexpr
> int foo(T) [with T = int]’
>
> see? The pretty printing of the previous declaration is very misleading
> because it has constexpr in it!

I'm guessing this happens because we're printing the type of the
template plus template arguments, and the template is declared
constexpr.  That should be easy enough to fix in dump_function_decl by
looking at the instantiation when deciding whether to print
"constexpr".

Jason
diff mbox

Patch

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 237443)
+++ cp/decl.c	(working copy)
@@ -1278,8 +1278,11 @@  validate_constexpr_redeclaration (tree old_decl, t
 	  && DECL_TEMPLATE_SPECIALIZATION (new_decl))
 	return true;
 
-      error ("redeclaration %q+D differs in %<constexpr%>", new_decl);
-      error ("from previous declaration %q+D", old_decl);
+      error_at (DECL_SOURCE_LOCATION (new_decl),
+		"redeclaration %qD differs in %<constexpr%> "
+		"from previous declaration", new_decl);
+      inform (DECL_SOURCE_LOCATION (old_decl),
+	      "previous declaration here");
       return false;
     }
   return true;
Index: testsuite/g++.dg/cpp0x/constexpr-specialization.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-specialization.C	(revision 237443)
+++ testsuite/g++.dg/cpp0x/constexpr-specialization.C	(working copy)
@@ -3,10 +3,10 @@ 
 
 template<typename T> constexpr int foo(T);
 template<> int foo(int);
-template<> int foo(int);            // { dg-error "previous" }
+template<> int foo(int);            // { dg-message "previous" }
 template<> constexpr int foo(int);  // { dg-error "redeclaration" }
 
 template<typename T> int bar(T);
 template<> constexpr int bar(int);
-template<> constexpr int bar(int);  // { dg-error "previous" }
+template<> constexpr int bar(int);  // { dg-message "previous" }
 template<> int bar(int);            // { dg-error "redeclaration" }