diff options
author | Jason Merrill <jason@redhat.com> | 2014-12-18 17:22:42 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-12-18 17:22:42 -0500 |
commit | 3696ea5851b122de32b3888be1a4121fc2038534 (patch) | |
tree | a01f9ba5576bf65782455163941593d22e82aa0c /gcc | |
parent | 1b82e09e18d5c5f1e73b457864f1a310fcfb3f77 (diff) | |
download | gcc-3696ea5851b122de32b3888be1a4121fc2038534.zip gcc-3696ea5851b122de32b3888be1a4121fc2038534.tar.gz gcc-3696ea5851b122de32b3888be1a4121fc2038534.tar.bz2 |
re PR c++/64352 (No SFINAE with deleted function)
PR c++/64352
* pt.c (tsubst_copy_and_build): Pass complain to mark_used.
From-SVN: r218877
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/deleted9.C | 31 |
3 files changed, 35 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 80892b6..c80690d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-12-18 Jason Merrill <jason@redhat.com> + PR c++/64352 + * pt.c (tsubst_copy_and_build): Pass complain to mark_used. + PR c++/64251 * decl2.c (mark_used): Don't mark if in_template_function. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9f03684..2a63a2e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -15115,7 +15115,7 @@ tsubst_copy_and_build (tree t, /* Remember that there was a reference to this entity. */ if (DECL_P (function)) - mark_used (function); + mark_used (function, complain); /* Put back tf_decltype for the actual call. */ complain |= decltype_flag; diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted9.C b/gcc/testsuite/g++.dg/cpp0x/deleted9.C new file mode 100644 index 0000000..af97be7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/deleted9.C @@ -0,0 +1,31 @@ +// PR c++/64352 +// { dg-do compile { target c++11 } } + +template<bool B> struct bool_type +{ static constexpr bool value = B; }; + +using true_type = bool_type<true>; +using false_type = bool_type<false>; + +template<typename T> T&& declval(); + +template<typename...> struct void_ { using type = void; }; +template<typename... I> using void_t = typename void_<I...>::type; + +template<typename _Tp, typename = void> +struct _Has_addressof_free: false_type { }; + +template<typename _Tp> +struct _Has_addressof_free +<_Tp, void_t<decltype( operator&(declval<const _Tp&>()) )>> +: true_type { }; + +struct foo {}; +void operator&(foo) = delete; + +int main() +{ + static_assert( !_Has_addressof_free<int>::value, "" ); + // error: use of deleted function 'void operator&(foo)' + static_assert( !_Has_addressof_free<foo>::value, "" ); +} |