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

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@318208 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Marshall Clow
2017-11-14 22:26:50 +00:00
parent e208d0895a
commit c9f5f10562
3 changed files with 63 additions and 0 deletions

View File

@@ -121,6 +121,9 @@
#ifndef __has_feature #ifndef __has_feature
#define __has_feature(__x) 0 #define __has_feature(__x) 0
#endif #endif
#ifndef __has_cpp_attribute
#define __has_cpp_attribute(__x) 0
#endif
// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by // '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
// the compiler and '1' otherwise. // the compiler and '1' otherwise.
#ifndef __is_identifier #ifndef __is_identifier
@@ -951,6 +954,18 @@ template <unsigned> struct __static_assert_check {};
#define _LIBCPP_CONSTEXPR_AFTER_CXX14 #define _LIBCPP_CONSTEXPR_AFTER_CXX14
#endif #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. // FIXME: Remove all usages of this macro once compilers catch up.
#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606L) #if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606L)
# define _LIBCPP_HAS_NO_INLINE_VARIABLES # define _LIBCPP_HAS_NO_INLINE_VARIABLES

View File

@@ -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}}
}

View File

@@ -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!
}