Commit 6fe7ce18 by Marek Polacek Committed by Marek Polacek

PR c++/89537 - missing location for error with non-static member fn.

	* call.c (resolve_args): Use EXPR_LOCATION.
	* typeck.c (build_class_member_access_expr): Use input_location.

	* g++.dg/diagnostic/member-fn-1.C: New test.

From-SVN: r269318
parent d724d2af
2019-03-01 Marek Polacek <polacek@redhat.com> 2019-03-01 Marek Polacek <polacek@redhat.com>
PR c++/89537 - missing location for error with non-static member fn.
* call.c (resolve_args): Use EXPR_LOCATION.
* typeck.c (build_class_member_access_expr): Use input_location.
PR c++/89532 - ICE with incomplete type in decltype. PR c++/89532 - ICE with incomplete type in decltype.
* semantics.c (finish_compound_literal): Return error_mark_node * semantics.c (finish_compound_literal): Return error_mark_node
if digest_init_flags returns error_mark_node. if digest_init_flags returns error_mark_node.
......
...@@ -4246,7 +4246,7 @@ resolve_args (vec<tree, va_gc> *args, tsubst_flags_t complain) ...@@ -4246,7 +4246,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->exp.locus, arg, complain)) else if (invalid_nonstatic_memfn_p (EXPR_LOCATION (arg), arg, complain))
return NULL; return NULL;
} }
return args; return args;
......
...@@ -2562,7 +2562,8 @@ build_class_member_access_expr (cp_expr object, tree member, ...@@ -2562,7 +2562,8 @@ build_class_member_access_expr (cp_expr object, tree member,
type = unknown_type_node; type = unknown_type_node;
/* Note that we do not convert OBJECT to the BASELINK_BINFO /* Note that we do not convert OBJECT to the BASELINK_BINFO
base. That will happen when the function is called. */ base. That will happen when the function is called. */
result = build3 (COMPONENT_REF, type, object, member, NULL_TREE); result = build3_loc (input_location, COMPONENT_REF, type, object, member,
NULL_TREE);
} }
else if (TREE_CODE (member) == CONST_DECL) else if (TREE_CODE (member) == CONST_DECL)
{ {
......
2019-03-01 Marek Polacek <polacek@redhat.com> 2019-03-01 Marek Polacek <polacek@redhat.com>
PR c++/89537 - missing location for error with non-static member fn.
* g++.dg/diagnostic/member-fn-1.C: New test.
PR c++/89532 - ICE with incomplete type in decltype. PR c++/89532 - ICE with incomplete type in decltype.
* g++.dg/cpp2a/nontype-class14.C: New test. * g++.dg/cpp2a/nontype-class14.C: New test.
......
// PR c++/89537
// { dg-do compile { target c++11 } }
template <typename> class A {};
template <typename, typename, typename, typename> class B;
class C {
using mapped_type = int;
public:
template <typename _Compare>
C(B<mapped_type, _Compare, A<int>, A<int>> *p1, unsigned)
: keys(p1->keys), // { dg-error "18: invalid use of non-static member function" }
values(p1->values) {} // { dg-error "20: invalid use of non-static member function" }
A<int> keys;
A<int> values;
};
class D {
public:
using key_compare = int;
template <typename _Alloc> D(key_compare, _Alloc);
};
template <typename _Tp, typename, typename, typename = A<_Tp>> class B {
using _Impl = D;
_Impl _M_impl;
public:
using key_compare = int;
using iterator = C;
template <typename _Alloc> B(key_compare p1, _Alloc p2) : _M_impl(p1, p2) {}
template <typename _Alloc> B(_Alloc p1) : B(key_compare(), p1) {}
iterator begin() { return {this, 0}; }
void keys();
void values();
};
void fn1() {
B<int, int, A<int>> m(fn1);
m.begin();
}
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