Commit 080384d6 by Jason Merrill Committed by Jason Merrill

PR c++/71568 - SFINAE forming pointer to member function

	* init.c (build_offset_ref): Check the return value of
	perform_or_defer_access_check.

From-SVN: r245763
parent c8f28a3c
2017-02-27 Jason Merrill <jason@redhat.com>
PR c++/71568 - SFINAE forming pointer to member function
* init.c (build_offset_ref): Check the return value of
perform_or_defer_access_check.
2017-02-27 Marek Polacek <polacek@redhat.com> 2017-02-27 Marek Polacek <polacek@redhat.com>
* decl.c (expand_static_init): Add missing } in a comment. * decl.c (expand_static_init): Add missing } in a comment.
......
...@@ -2043,14 +2043,16 @@ build_offset_ref (tree type, tree member, bool address_p, ...@@ -2043,14 +2043,16 @@ build_offset_ref (tree type, tree member, bool address_p,
If the access is to form a pointer to member, the If the access is to form a pointer to member, the
nested-name-specifier shall name the derived class nested-name-specifier shall name the derived class
(or any class derived from that class). */ (or any class derived from that class). */
bool ok;
if (address_p && DECL_P (t) if (address_p && DECL_P (t)
&& DECL_NONSTATIC_MEMBER_P (t)) && DECL_NONSTATIC_MEMBER_P (t))
perform_or_defer_access_check (TYPE_BINFO (type), t, t, ok = perform_or_defer_access_check (TYPE_BINFO (type), t, t,
complain); complain);
else else
perform_or_defer_access_check (basebinfo, t, t, ok = perform_or_defer_access_check (basebinfo, t, t,
complain); complain);
if (!ok)
return error_mark_node;
if (DECL_STATIC_FUNCTION_P (t)) if (DECL_STATIC_FUNCTION_P (t))
return t; return t;
member = t; member = t;
...@@ -2059,11 +2061,14 @@ build_offset_ref (tree type, tree member, bool address_p, ...@@ -2059,11 +2061,14 @@ build_offset_ref (tree type, tree member, bool address_p,
TREE_TYPE (member) = unknown_type_node; TREE_TYPE (member) = unknown_type_node;
} }
else if (address_p && TREE_CODE (member) == FIELD_DECL) else if (address_p && TREE_CODE (member) == FIELD_DECL)
/* We need additional test besides the one in {
check_accessibility_of_qualified_id in case it is /* We need additional test besides the one in
a pointer to non-static member. */ check_accessibility_of_qualified_id in case it is
perform_or_defer_access_check (TYPE_BINFO (type), member, member, a pointer to non-static member. */
complain); if (!perform_or_defer_access_check (TYPE_BINFO (type), member, member,
complain))
return error_mark_node;
}
if (!address_p) if (!address_p)
{ {
......
// PR c++/71568
// { dg-do compile { target c++11 } }
template <typename T> class F : T {};
template <typename> using void_t = void;
template <class, class = void> struct G;
template <typename T> struct G<T, void_t<decltype(&T::nlog_custom)>> {};
struct D {
void nlog_custom();
};
G<F<D>> g; // { dg-error "incomplete" }
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