decl.c (validate_constexpr_redeclaration): Change pair of errors to error + inform.
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 17 Jun 2016 20:01:46 +0000 (20:01 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 17 Jun 2016 20:01:46 +0000 (20:01 +0000)
/cp
2016-06-17  Paolo Carlini  <paolo.carlini@oracle.com>

* decl.c (validate_constexpr_redeclaration): Change pair of errors
to error + inform.
* error.c (dump_function_decl): Save the constexpr specifier too.

/testsuite
2016-06-17  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/cpp0x/constexpr-specialization.C: Adjust for dg-message
vs dg-error; test constexpr specifier too.

From-SVN: r237564

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/error.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C

index 166ec2d6f034757e27e484bac03b5b087a878d50..8ff9630e866b3c9eea29c22b48147dda0132e77c 100644 (file)
@@ -1,3 +1,9 @@
+2016-06-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl.c (validate_constexpr_redeclaration): Change pair of errors
+       to error + inform.
+       * error.c (dump_function_decl): Save the constexpr specifier too.
+
 2016-06-17  Jakub Jelinek  <jakub@redhat.com>
 
        * tree.c (builtin_valid_in_constant_expr_p): Test for
index 59abd15cf29e44e89cf3ce2df3fa31a2e4518408..c86a131d4894ba040d65e6c35b7c454a93473e6f 100644 (file)
@@ -1281,8 +1281,11 @@ validate_constexpr_redeclaration (tree old_decl, tree new_decl)
          && 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 %qD", old_decl);
       return false;
     }
   return true;
index 7d70f892b3cac37f1591d22fa5506a176cc07225..d5a7d0f9efdc877d2cdd0b6acf80123f319ebbdc 100644 (file)
@@ -1486,6 +1486,7 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags)
   int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
   int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
   tree exceptions;
+  bool constexpr_p;
 
   flags &= ~(TFF_UNQUALIFIED_NAME | TFF_TEMPLATE_NAME);
   if (TREE_CODE (t) == TEMPLATE_DECL)
@@ -1495,6 +1496,9 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags)
      emitting an error about incompatible specifications.  */
   exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
 
+  /* Likewise for the constexpr specifier, in case t is a specialization.  */
+  constexpr_p = DECL_DECLARED_CONSTEXPR_P (t);
+
   /* Pretty print template instantiations only.  */
   if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
       && flag_pretty_templates)
@@ -1529,7 +1533,7 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags)
       else if (DECL_VIRTUAL_P (t))
        pp_cxx_ws_string (pp, "virtual");
 
-      if (DECL_DECLARED_CONSTEXPR_P (t))
+      if (constexpr_p)
        pp_cxx_ws_string (pp, "constexpr");
     }
 
index cb950cd5c5fd79bc79b460b2899dc51466e921d5..e717ea0851befaa08cda110dfea18762c0d273bb 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/cpp0x/constexpr-specialization.C: Adjust for dg-message
+       vs dg-error; test constexpr specifier too.
+
 2016-06-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * g++.dg/cpp0x/defaulted31.C: Adjust for dg-message vs dg-error.
index 80f56a19615a890b9b220cb885a62b608abadb90..64d8f4ec2666d1e5cbe86897940d7ae02128c440 100644 (file)
@@ -3,10 +3,10 @@
 
 template<typename T> constexpr int foo(T);
 template<> int foo(int);
-template<> int foo(int);            // { dg-error "previous" }
-template<> constexpr int foo(int);  // { dg-error "redeclaration" }
+template<> int foo(int);            // { dg-message "previous declaration 'int foo" }
+template<> constexpr int foo(int);  // { dg-error "redeclaration 'constexpr int foo" }
 
 template<typename T> int bar(T);
 template<> constexpr int bar(int);
-template<> constexpr int bar(int);  // { dg-error "previous" }
-template<> int bar(int);            // { dg-error "redeclaration" }
+template<> constexpr int bar(int);  // { dg-message "previous declaration 'constexpr int bar" }
+template<> int bar(int);            // { dg-error "redeclaration 'int bar" }