aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2015-06-03 19:23:20 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2015-06-03 19:23:20 +0000
commitd3ea4c064f6e6370eb791985fef4acdd5fb1b833 (patch)
tree8c52823d6a36b1409914c63e7e541f67d8c6a56d /gcc
parent4753e009664aa5d4cdf0ce86a03224f5bc1f9d7b (diff)
downloadgcc-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/ChangeLog13
-rw-r--r--gcc/cp/call.c10
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/cp/cvt.c4
-rw-r--r--gcc/cp/semantics.c2
-rw-r--r--gcc/cp/typeck.c16
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr66130.C11
-rw-r--r--gcc/testsuite/g++.dg/other/pr66130.C11
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;
+};