EricWF created this revision.
EricWF added reviewers: mclow.lists, chandlerc.
EricWF added a subscriber: cfe-commits.
The title says it all.
I just want to check that we agree on the general direction of this patch.
Specifically that libc++ should be free to apply `no_discard` where we feel
appropriate. If we agree then some other candidates are:
- Containers `empty()` and `size()` methods.
- `try_lock()` functions.
- other `release()` functions.
Additional suggestions welcome!
This patch fixes PR30898 (https://llvm.org/bugs/show_bug.cgi?id=30898)
https://reviews.llvm.org/D26596
Files:
include/__config
include/memory
test/libcxx/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.modifiers/release.fail.cpp
test/libcxx/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.modifiers/release.fail.cpp
Index: test/libcxx/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.modifiers/release.fail.cpp
===================================================================
--- /dev/null
+++ test/libcxx/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.modifiers/release.fail.cpp
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <memory>
+
+// unique_ptr
+
+// test release
+
+#include <memory>
+#include <cassert>
+
+int main()
+{
+ std::unique_ptr<int> p(new int(3));
+ int* i = p.get();
+ p.release(); // expected-warning {{ignoring return value of function declared with 'warn_unused_result' attribute}}
+ delete i;
+}
Index: test/libcxx/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.modifiers/release.fail.cpp
===================================================================
--- /dev/null
+++ test/libcxx/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.modifiers/release.fail.cpp
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <memory>
+
+// unique_ptr
+
+// test release
+
+#include <memory>
+#include <cassert>
+
+int main()
+{
+ std::unique_ptr<int[]> p(new int[3]);
+ int* i = p.get();
+ p.release(); // expected-warning {{ignoring return value of function declared with 'warn_unused_result' attribute}}
+ delete [] i;
+}
Index: include/memory
===================================================================
--- include/memory
+++ include/memory
@@ -2768,7 +2768,7 @@
_LIBCPP_EXPLICIT operator bool() const _NOEXCEPT
{return __ptr_.first() != nullptr;}
- _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT
+ _LIBCPP_NO_DISCARD _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT
{
pointer __t = __ptr_.first();
__ptr_.first() = pointer();
@@ -2959,7 +2959,7 @@
_LIBCPP_EXPLICIT operator bool() const _NOEXCEPT
{return __ptr_.first() != nullptr;}
- _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT
+ _LIBCPP_NO_DISCARD _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT
{
pointer __t = __ptr_.first();
__ptr_.first() = pointer();
Index: include/__config
===================================================================
--- include/__config
+++ include/__config
@@ -900,6 +900,14 @@
#define _LIBCPP_SAFE_STATIC
#endif
+#ifndef _LIBCPP_NO_DISCARD
+# if __has_attribute(warn_unused_result) || _GNUC_VER > 408
+# define _LIBCPP_NO_DISCARD __attribute__((__warn_unused_result__))
+# else
+# define _LIBCPP_NO_DISCARD
+# endif
+#endif // !defined(_LIBCPP_NO_DISCARD)
+
#if !__has_builtin(__builtin_addressof) && _GNUC_VER < 700
#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
#endif
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits