From: Manuel López-Ibáñez Date: Wed, 3 Jun 2015 19:23:20 +0000 (+0000) Subject: re PR c++/66130 ("invalid use of non-static member function" message could be clearer) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d3ea4c064f6e6370eb791985fef4acdd5fb1b833;p=gcc.git re PR c++/66130 ("invalid use of non-static member function" message could be clearer) 2015-06-03 Manuel López-Ibáñez Paolo Carlini 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 Paolo Carlini PR c++/66130 * g++.dg/other/pr66130.C: New. * g++.dg/cpp0x/pr66130.C: Likewise. Co-Authored-By: Paolo Carlini From-SVN: r224099 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2c61d557716..39888b970b0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2015-06-03 Manuel López-Ibáñez + Paolo Carlini + + 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 * decl.c (check_tag_decl): Use declspecs->locations as locations in diff --git a/gcc/cp/call.c b/gcc/cp/call.c index bad49f15d48..71f7e06013c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3941,7 +3941,7 @@ resolve_args (vec *args, tsubst_flags_t complain) error ("invalid use of void expression"); return NULL; } - else if (invalid_nonstatic_memfn_p (arg, complain)) + else if (invalid_nonstatic_memfn_p (input_location, arg, complain)) return NULL; } return args; @@ -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 an invalid use of member function pointer, try to report a meaningful error ... */ - if (invalid_nonstatic_memfn_p (arg1, tf_error) - || invalid_nonstatic_memfn_p (arg2, tf_error) - || invalid_nonstatic_memfn_p (arg3, tf_error)) + if (invalid_nonstatic_memfn_p (loc, arg1, tf_error) + || invalid_nonstatic_memfn_p (loc, arg2, tf_error) + || invalid_nonstatic_memfn_p (loc, arg3, tf_error)) /* We displayed the error message. */; else { @@ -9445,7 +9445,7 @@ perform_implicit_conversion_flags (tree type, tree expr, Call instantiate_type to get good error messages. */ if (TREE_TYPE (expr) == unknown_type_node) 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. */; else error_at (loc, "could not convert %qE from %qT to %qT", expr, diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 9107fa68b64..76be7cca6f1 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6281,7 +6281,8 @@ extern tree build_address (tree); extern tree build_nop (tree, tree); extern tree non_reference (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_ptrmem (tree, tree, bool, bool, tsubst_flags_t); diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 9aa9006f192..ae0326eaba2 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -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 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. */; else 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) if (!TREE_TYPE (expr)) return expr; - if (invalid_nonstatic_memfn_p (expr, complain)) + if (invalid_nonstatic_memfn_p (loc, expr, complain)) return error_mark_node; if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR) { diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 565941f0f5e..b1c280f6748 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7237,7 +7237,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, 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; if (type_unknown_p (expr)) diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index fef4f4f1304..4da6275f0df 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1810,7 +1810,7 @@ cxx_alignas_expr (tree e) violates these rules. */ 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) return false; @@ -1822,7 +1822,17 @@ invalid_nonstatic_memfn_p (tree expr, tsubst_flags_t complain) if (DECL_NONSTATIC_MEMBER_FUNCTION_P (expr)) { 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 false; @@ -1946,7 +1956,7 @@ decay_conversion (tree exp, tsubst_flags_t complain) error_at (loc, "void value not ignored as it ought to be"); return error_mark_node; } - if (invalid_nonstatic_memfn_p (exp, complain)) + if (invalid_nonstatic_memfn_p (loc, exp, complain)) return error_mark_node; if (code == FUNCTION_TYPE || is_overloaded_fn (exp)) return cp_build_addr_expr (exp, complain); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 53c7018f3e0..a74be77df88 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-06-03 Manuel López-Ibáñez + Paolo Carlini + + PR c++/66130 + * g++.dg/other/pr66130.C: New. + * g++.dg/cpp0x/pr66130.C: Likewise. + 2015-06-03 Paolo Carlini * g++.dg/cpp0x/decl-loc1.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/pr66130.C b/gcc/testsuite/g++.dg/cpp0x/pr66130.C new file mode 100644 index 00000000000..5d4a72e1a7b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr66130.C @@ -0,0 +1,11 @@ +// 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::\\)\\(\\)'" } diff --git a/gcc/testsuite/g++.dg/other/pr66130.C b/gcc/testsuite/g++.dg/other/pr66130.C new file mode 100644 index 00000000000..b109b9300ff --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr66130.C @@ -0,0 +1,11 @@ +// 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; +};