diff options
Diffstat (limited to 'libcxx')
| -rw-r--r-- | libcxx/include/__config | 15 | ||||
| -rw-r--r-- | libcxx/test/libcxx/diagnostics/nodiscard.fail.cpp | 24 | ||||
| -rw-r--r-- | libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp | 24 |
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! +} |

