summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2017-11-14 22:26:50 +0000
committerMarshall Clow <mclow.lists@gmail.com>2017-11-14 22:26:50 +0000
commit1644c12ef8167346c667847e91f000806557f450 (patch)
tree115d8bce3047526642c0dc6e8f4ef53bbbc670dd /libcxx
parentde5ed0c58e4471e51f46d0572142788aaebb0143 (diff)
downloadbcm5719-llvm-1644c12ef8167346c667847e91f000806557f450.tar.gz
bcm5719-llvm-1644c12ef8167346c667847e91f000806557f450.zip
Add two new macros: _LIBCPP_NODISCARD_AFTER_CXX17 and _LIBCPP_CONSTEXPR_AFTER_CXX17, along with a way to turn off the NODISCARD one: _LIBCPP_DISABLE_NODISCARD_AFTER_CXX17. No one is using these yet, but we will be ... soon
llvm-svn: 318208
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/__config15
-rw-r--r--libcxx/test/libcxx/diagnostics/nodiscard.fail.cpp24
-rw-r--r--libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp24
3 files changed, 63 insertions, 0 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config
index d6217234a8b..f62859f3401 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -121,6 +121,9 @@
#ifndef __has_feature
#define __has_feature(__x) 0
#endif
+#ifndef __has_cpp_attribute
+#define __has_cpp_attribute(__x) 0
+#endif
// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
// the compiler and '1' otherwise.
#ifndef __is_identifier
@@ -951,6 +954,18 @@ template <unsigned> struct __static_assert_check {};
#define _LIBCPP_CONSTEXPR_AFTER_CXX14
#endif
+#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
+#define _LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr
+#else
+#define _LIBCPP_CONSTEXPR_AFTER_CXX17
+#endif
+
+#if __has_cpp_attribute(nodiscard) && _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17)
+#define _LIBCPP_NODISCARD_AFTER_CXX17 [[nodiscard]]
+#else
+#define _LIBCPP_NODISCARD_AFTER_CXX17
+#endif
+
// FIXME: Remove all usages of this macro once compilers catch up.
#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606L)
# define _LIBCPP_HAS_NO_INLINE_VARIABLES
diff --git a/libcxx/test/libcxx/diagnostics/nodiscard.fail.cpp b/libcxx/test/libcxx/diagnostics/nodiscard.fail.cpp
new file mode 100644
index 00000000000..903a24a7280
--- /dev/null
+++ b/libcxx/test/libcxx/diagnostics/nodiscard.fail.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that _LIBCPP_NODISCARD_AFTER_CXX17 works
+// #define _LIBCPP_NODISCARD_AFTER_CXX17 [[nodiscard]]
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8
+
+#include <__config>
+
+_LIBCPP_NODISCARD_AFTER_CXX17 int foo() { return 6; }
+
+int main ()
+{
+ foo(); // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}}
+}
diff --git a/libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp b/libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp
new file mode 100644
index 00000000000..b001d672d3f
--- /dev/null
+++ b/libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that _LIBCPP_NODISCARD_AFTER_CXX17 works
+// #define _LIBCPP_NODISCARD_AFTER_CXX17 [[nodiscard]]
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14
+
+#define _LIBCPP_DISABLE_AFTER_CXX17_NODISCARD
+#include <__config>
+
+_LIBCPP_NODISCARD_AFTER_CXX17 int foo() { return 6; }
+
+int main ()
+{
+ foo(); // no error here!
+}
OpenPOWER on IntegriCloud