aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-12-18 17:22:42 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-12-18 17:22:42 -0500
commit3696ea5851b122de32b3888be1a4121fc2038534 (patch)
treea01f9ba5576bf65782455163941593d22e82aa0c /gcc
parent1b82e09e18d5c5f1e73b457864f1a310fcfb3f77 (diff)
downloadgcc-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/ChangeLog3
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/deleted9.C31
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, "" );
+}