Commit d3ea4c06 by Manuel López-Ibáñez Committed by Paolo Carlini

re PR c++/66130 ("invalid use of non-static member function" message could be clearer)

2015-06-03  Manuel López-Ibáñez  <manu@gcc.gnu.org>
	    Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/66130
	* typeck.c (invalid_nonstatic_memfn_p): Add location_t parameter and
	use it in the diagnostic.
	(decay_conversion): Adjust call.
	* semantics.c (finish_decltype_type): Likewise.
	* call.c (resolve_args, build_new_op_1,
	perform_implicit_conversion_flags): Adjust calls.
	* cvt.c (ocp_convert, convert_to_void): Likewise.
	* cp-tree.h (invalid_nonstatic_memfn_p): Update declaration.

2015-06-03  Manuel López-Ibáñez  <manu@gcc.gnu.org>
	    Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/66130
	* g++.dg/other/pr66130.C: New.
	* g++.dg/cpp0x/pr66130.C: Likewise.

Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>

From-SVN: r224099
parent 4753e009
2015-06-03 Manuel López-Ibáñez <manu@gcc.gnu.org>
Paolo Carlini <paolo.carlini@oracle.com>
PR c++/66130
* typeck.c (invalid_nonstatic_memfn_p): Add location_t parameter and
use it in the diagnostic.
(decay_conversion): Adjust call.
* semantics.c (finish_decltype_type): Likewise.
* call.c (resolve_args, build_new_op_1,
perform_implicit_conversion_flags): Adjust calls.
* cvt.c (ocp_convert, convert_to_void): Likewise.
* cp-tree.h (invalid_nonstatic_memfn_p): Update declaration.
2015-06-03 Paolo Carlini <paolo.carlini@oracle.com> 2015-06-03 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (check_tag_decl): Use declspecs->locations as locations in * decl.c (check_tag_decl): Use declspecs->locations as locations in
......
...@@ -3941,7 +3941,7 @@ resolve_args (vec<tree, va_gc> *args, tsubst_flags_t complain) ...@@ -3941,7 +3941,7 @@ resolve_args (vec<tree, va_gc> *args, tsubst_flags_t complain)
error ("invalid use of void expression"); error ("invalid use of void expression");
return NULL; return NULL;
} }
else if (invalid_nonstatic_memfn_p (arg, complain)) else if (invalid_nonstatic_memfn_p (input_location, arg, complain))
return NULL; return NULL;
} }
return args; return args;
...@@ -5542,9 +5542,9 @@ build_new_op_1 (location_t loc, enum tree_code code, int flags, tree arg1, ...@@ -5542,9 +5542,9 @@ build_new_op_1 (location_t loc, enum tree_code code, int flags, tree arg1,
/* If one of the arguments of the operator represents /* If one of the arguments of the operator represents
an invalid use of member function pointer, try to report an invalid use of member function pointer, try to report
a meaningful error ... */ a meaningful error ... */
if (invalid_nonstatic_memfn_p (arg1, tf_error) if (invalid_nonstatic_memfn_p (loc, arg1, tf_error)
|| invalid_nonstatic_memfn_p (arg2, tf_error) || invalid_nonstatic_memfn_p (loc, arg2, tf_error)
|| invalid_nonstatic_memfn_p (arg3, tf_error)) || invalid_nonstatic_memfn_p (loc, arg3, tf_error))
/* We displayed the error message. */; /* We displayed the error message. */;
else else
{ {
...@@ -9445,7 +9445,7 @@ perform_implicit_conversion_flags (tree type, tree expr, ...@@ -9445,7 +9445,7 @@ perform_implicit_conversion_flags (tree type, tree expr,
Call instantiate_type to get good error messages. */ Call instantiate_type to get good error messages. */
if (TREE_TYPE (expr) == unknown_type_node) if (TREE_TYPE (expr) == unknown_type_node)
instantiate_type (type, expr, complain); instantiate_type (type, expr, complain);
else if (invalid_nonstatic_memfn_p (expr, complain)) else if (invalid_nonstatic_memfn_p (loc, expr, complain))
/* We gave an error. */; /* We gave an error. */;
else else
error_at (loc, "could not convert %qE from %qT to %qT", expr, error_at (loc, "could not convert %qE from %qT to %qT", expr,
......
...@@ -6281,7 +6281,8 @@ extern tree build_address (tree); ...@@ -6281,7 +6281,8 @@ extern tree build_address (tree);
extern tree build_nop (tree, tree); extern tree build_nop (tree, tree);
extern tree non_reference (tree); extern tree non_reference (tree);
extern tree lookup_anon_field (tree, tree); extern tree lookup_anon_field (tree, tree);
extern bool invalid_nonstatic_memfn_p (tree, tsubst_flags_t); extern bool invalid_nonstatic_memfn_p (location_t, tree,
tsubst_flags_t);
extern tree convert_member_func_to_ptr (tree, tree, tsubst_flags_t); extern tree convert_member_func_to_ptr (tree, tree, tsubst_flags_t);
extern tree convert_ptrmem (tree, tree, bool, bool, extern tree convert_ptrmem (tree, tree, bool, bool,
tsubst_flags_t); tsubst_flags_t);
......
...@@ -902,7 +902,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags, ...@@ -902,7 +902,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags,
{ {
/* If the conversion failed and expr was an invalid use of pointer to /* If the conversion failed and expr was an invalid use of pointer to
member function, try to report a meaningful error. */ member function, try to report a meaningful error. */
if (invalid_nonstatic_memfn_p (expr, complain)) if (invalid_nonstatic_memfn_p (loc, expr, complain))
/* We displayed the error message. */; /* We displayed the error message. */;
else else
error_at (loc, "conversion from %qT to non-scalar type %qT requested", error_at (loc, "conversion from %qT to non-scalar type %qT requested",
...@@ -960,7 +960,7 @@ convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain) ...@@ -960,7 +960,7 @@ convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain)
if (!TREE_TYPE (expr)) if (!TREE_TYPE (expr))
return expr; return expr;
if (invalid_nonstatic_memfn_p (expr, complain)) if (invalid_nonstatic_memfn_p (loc, expr, complain))
return error_mark_node; return error_mark_node;
if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR) if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
{ {
......
...@@ -7237,7 +7237,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, ...@@ -7237,7 +7237,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
expr = resolve_nondeduced_context (expr); expr = resolve_nondeduced_context (expr);
if (invalid_nonstatic_memfn_p (expr, complain)) if (invalid_nonstatic_memfn_p (input_location, expr, complain))
return error_mark_node; return error_mark_node;
if (type_unknown_p (expr)) if (type_unknown_p (expr))
......
...@@ -1810,7 +1810,7 @@ cxx_alignas_expr (tree e) ...@@ -1810,7 +1810,7 @@ cxx_alignas_expr (tree e)
violates these rules. */ violates these rules. */
bool bool
invalid_nonstatic_memfn_p (tree expr, tsubst_flags_t complain) invalid_nonstatic_memfn_p (location_t loc, tree expr, tsubst_flags_t complain)
{ {
if (expr == NULL_TREE) if (expr == NULL_TREE)
return false; return false;
...@@ -1822,7 +1822,17 @@ invalid_nonstatic_memfn_p (tree expr, tsubst_flags_t complain) ...@@ -1822,7 +1822,17 @@ invalid_nonstatic_memfn_p (tree expr, tsubst_flags_t complain)
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (expr)) if (DECL_NONSTATIC_MEMBER_FUNCTION_P (expr))
{ {
if (complain & tf_error) if (complain & tf_error)
error ("invalid use of non-static member function"); {
if (DECL_P (expr))
{
error_at (loc, "invalid use of non-static member function %qD",
expr);
inform (DECL_SOURCE_LOCATION (expr), "declared here");
}
else
error_at (loc, "invalid use of non-static member function of "
"type %qT", TREE_TYPE (expr));
}
return true; return true;
} }
return false; return false;
...@@ -1946,7 +1956,7 @@ decay_conversion (tree exp, tsubst_flags_t complain) ...@@ -1946,7 +1956,7 @@ decay_conversion (tree exp, tsubst_flags_t complain)
error_at (loc, "void value not ignored as it ought to be"); error_at (loc, "void value not ignored as it ought to be");
return error_mark_node; return error_mark_node;
} }
if (invalid_nonstatic_memfn_p (exp, complain)) if (invalid_nonstatic_memfn_p (loc, exp, complain))
return error_mark_node; return error_mark_node;
if (code == FUNCTION_TYPE || is_overloaded_fn (exp)) if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
return cp_build_addr_expr (exp, complain); return cp_build_addr_expr (exp, complain);
......
2015-06-03 Manuel López-Ibáñez <manu@gcc.gnu.org>
Paolo Carlini <paolo.carlini@oracle.com>
PR c++/66130
* g++.dg/other/pr66130.C: New.
* g++.dg/cpp0x/pr66130.C: Likewise.
2015-06-03 Paolo Carlini <paolo.carlini@oracle.com> 2015-06-03 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/cpp0x/decl-loc1.C: New. * g++.dg/cpp0x/decl-loc1.C: New.
......
// PR c++/66130
// { dg-do compile { target c++11 } }
struct Local
{
void f();
};
Local *l;
void (Local::*ptr)();
decltype((l->*ptr)) i; // { dg-error "member function of type 'void \\(Local::\\)\\(\\)'" }
// PR c++/66130
struct X {
X(void *);
void m(); // { dg-message "declared here" }
};
struct Y : public X{
Y(void*a, void *b) : X(m), mb(b) { } // { dg-error "member function 'void X::m\\(\\)'" }
void *mb;
};
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