diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2015-06-03 19:23:20 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2015-06-03 19:23:20 +0000 |
commit | d3ea4c064f6e6370eb791985fef4acdd5fb1b833 (patch) | |
tree | 8c52823d6a36b1409914c63e7e541f67d8c6a56d /gcc | |
parent | 4753e009664aa5d4cdf0ce86a03224f5bc1f9d7b (diff) | |
download | gcc-d3ea4c064f6e6370eb791985fef4acdd5fb1b833.zip gcc-d3ea4c064f6e6370eb791985fef4acdd5fb1b833.tar.gz gcc-d3ea4c064f6e6370eb791985fef4acdd5fb1b833.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/call.c | 10 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 3 | ||||
-rw-r--r-- | gcc/cp/cvt.c | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 2 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr66130.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/pr66130.C | 11 |
9 files changed, 65 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2c61d55..39888b9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +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> * decl.c (check_tag_decl): Use declspecs->locations as locations in diff --git a/gcc/cp/call.c b/gcc/cp/call.c index bad49f1..71f7e06 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3941,7 +3941,7 @@ resolve_args (vec<tree, va_gc> *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 9107fa6..76be7cc 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 9aa9006..ae0326e 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 565941f..b1c280f 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 fef4f4f..4da6275 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 53c7018..a74be77 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +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> * 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 0000000..5d4a72e --- /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 0000000..b109b93 --- /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; +}; |