diff options
author | Jason Merrill <jason@redhat.com> | 2017-02-27 15:17:17 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-02-27 15:17:17 -0500 |
commit | 080384d6057018108dd588b456ed53ec0b752769 (patch) | |
tree | e51fcc04a68be52cef603f16c7c7a67a2695a9ba /gcc | |
parent | c8f28a3c7ae87e3114e5789fd3a20e46c3a879f6 (diff) | |
download | gcc-080384d6057018108dd588b456ed53ec0b752769.zip gcc-080384d6057018108dd588b456ed53ec0b752769.tar.gz gcc-080384d6057018108dd588b456ed53ec0b752769.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/sfinae58.C | 12 |
3 files changed, 33 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 03f92565..5792e5d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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> * decl.c (expand_static_init): Add missing } in a comment. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index b830822..99eeb8a 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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 nested-name-specifier shall name the derived class (or any class derived from that class). */ + bool ok; if (address_p && DECL_P (t) && DECL_NONSTATIC_MEMBER_P (t)) - perform_or_defer_access_check (TYPE_BINFO (type), t, t, - complain); + ok = perform_or_defer_access_check (TYPE_BINFO (type), t, t, + complain); else - perform_or_defer_access_check (basebinfo, t, t, - complain); - + ok = perform_or_defer_access_check (basebinfo, t, t, + complain); + if (!ok) + return error_mark_node; if (DECL_STATIC_FUNCTION_P (t)) return t; member = t; @@ -2059,11 +2061,14 @@ build_offset_ref (tree type, tree member, bool address_p, TREE_TYPE (member) = unknown_type_node; } 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 - a pointer to non-static member. */ - perform_or_defer_access_check (TYPE_BINFO (type), member, member, - complain); + { + /* We need additional test besides the one in + check_accessibility_of_qualified_id in case it is + a pointer to non-static member. */ + if (!perform_or_defer_access_check (TYPE_BINFO (type), member, member, + complain)) + return error_mark_node; + } if (!address_p) { diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae58.C b/gcc/testsuite/g++.dg/cpp0x/sfinae58.C new file mode 100644 index 0000000..aaa38d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae58.C @@ -0,0 +1,12 @@ +// 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" } + |