Commit c561b091 by Paolo Carlini Committed by Paolo Carlini

decl.c (validate_constexpr_redeclaration): Change pair of errors to error + inform.

/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
parent ce209777
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> 2016-06-17 Jakub Jelinek <jakub@redhat.com>
* tree.c (builtin_valid_in_constant_expr_p): Test for * tree.c (builtin_valid_in_constant_expr_p): Test for
......
...@@ -1281,8 +1281,11 @@ validate_constexpr_redeclaration (tree old_decl, tree new_decl) ...@@ -1281,8 +1281,11 @@ validate_constexpr_redeclaration (tree old_decl, tree new_decl)
&& DECL_TEMPLATE_SPECIALIZATION (new_decl)) && DECL_TEMPLATE_SPECIALIZATION (new_decl))
return true; return true;
error ("redeclaration %q+D differs in %<constexpr%>", new_decl); error_at (DECL_SOURCE_LOCATION (new_decl),
error ("from previous declaration %q+D", old_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 false;
} }
return true; return true;
......
...@@ -1486,6 +1486,7 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags) ...@@ -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 show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME); int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
tree exceptions; tree exceptions;
bool constexpr_p;
flags &= ~(TFF_UNQUALIFIED_NAME | TFF_TEMPLATE_NAME); flags &= ~(TFF_UNQUALIFIED_NAME | TFF_TEMPLATE_NAME);
if (TREE_CODE (t) == TEMPLATE_DECL) if (TREE_CODE (t) == TEMPLATE_DECL)
...@@ -1495,6 +1496,9 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags) ...@@ -1495,6 +1496,9 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags)
emitting an error about incompatible specifications. */ emitting an error about incompatible specifications. */
exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t)); 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. */ /* Pretty print template instantiations only. */
if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t) if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
&& flag_pretty_templates) && flag_pretty_templates)
...@@ -1529,7 +1533,7 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags) ...@@ -1529,7 +1533,7 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags)
else if (DECL_VIRTUAL_P (t)) else if (DECL_VIRTUAL_P (t))
pp_cxx_ws_string (pp, "virtual"); pp_cxx_ws_string (pp, "virtual");
if (DECL_DECLARED_CONSTEXPR_P (t)) if (constexpr_p)
pp_cxx_ws_string (pp, "constexpr"); pp_cxx_ws_string (pp, "constexpr");
} }
......
2016-06-17 Paolo Carlini <paolo.carlini@oracle.com> 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. * g++.dg/cpp0x/defaulted31.C: Adjust for dg-message vs dg-error.
2016-06-17 Christophe Lyon <christophe.lyon@linaro.org> 2016-06-17 Christophe Lyon <christophe.lyon@linaro.org>
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
template<typename T> constexpr int foo(T); template<typename T> constexpr int foo(T);
template<> int foo(int); template<> int foo(int);
template<> int foo(int); // { dg-error "previous" } template<> int foo(int); // { dg-message "previous declaration 'int foo" }
template<> constexpr int foo(int); // { dg-error "redeclaration" } template<> constexpr int foo(int); // { dg-error "redeclaration 'constexpr int foo" }
template<typename T> int bar(T); template<typename T> int bar(T);
template<> constexpr int bar(int); template<> constexpr int bar(int);
template<> constexpr int bar(int); // { dg-error "previous" } template<> constexpr int bar(int); // { dg-message "previous declaration 'constexpr int bar" }
template<> int bar(int); // { dg-error "redeclaration" } template<> int bar(int); // { dg-error "redeclaration 'int bar" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment