re PR c++/64352 (No SFINAE with deleted function)
authorJason Merrill <jason@redhat.com>
Thu, 18 Dec 2014 22:22:42 +0000 (17:22 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 18 Dec 2014 22:22:42 +0000 (17:22 -0500)
PR c++/64352
* pt.c (tsubst_copy_and_build): Pass complain to mark_used.

From-SVN: r218877

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/deleted9.C [new file with mode: 0644]

index 80892b600836a3bb5bffaa1ca5b52dde56421709..c80690db079b587588b742f8765678c8988ceaba 100644 (file)
@@ -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.
 
index 9f036846f58c02ce292e738aa5e76a89b46d8b14..2a63a2e1bca05bd38ef9e77e385ef29237262d7b 100644 (file)
@@ -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 (file)
index 0000000..af97be7
--- /dev/null
@@ -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, "" );
+}