Try to require C++14.
Now that we've dropped MSVC 2015, I believe we can rely on C++14 (which
is now seven years old). This switches the build to require C++14. I've
gone ahead and switched code in both public headers and within the
library, but if the public headers are a problem, we can revert those
separately.
C++14 doesn't get us quite as much as C++17, but see if we can get to
C++14 first. Still, std::enable_if_t and the less restricted constexpr
are nice wins.
Update-Note: C++14 is now required to build BoringSSL. If the build
breaks, make sure your compiler is C++14-capable and is not passing
-std=c++11. If this is causing problems for your project, let us know.
Change-Id: If03a88e3f8a11980180781f95b806e7f3c3cb6c3
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/52246
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/include/openssl/span.h b/include/openssl/span.h
index 38e9a96..67a1a5c 100644
--- a/include/openssl/span.h
+++ b/include/openssl/span.h
@@ -99,12 +99,11 @@
// Heuristically test whether C is a container type that can be converted into
// a Span by checking for data() and size() member functions.
//
- // TODO(davidben): Require C++14 support and switch to std::enable_if_t.
- // Perhaps even C++17 now?
+ // TODO(davidben): Require C++17 support for std::is_convertible_v, etc.
template <typename C>
- using EnableIfContainer = typename std::enable_if<
+ using EnableIfContainer = std::enable_if_t<
std::is_convertible<decltype(std::declval<C>().data()), T *>::value &&
- std::is_integral<decltype(std::declval<C>().size())>::value>::type;
+ std::is_integral<decltype(std::declval<C>().size())>::value>;
public:
constexpr Span() : Span(nullptr, 0) {}
@@ -113,14 +112,12 @@
template <size_t N>
constexpr Span(T (&array)[N]) : Span(array, N) {}
- template <
- typename C, typename = EnableIfContainer<C>,
- typename = typename std::enable_if<std::is_const<T>::value, C>::type>
+ template <typename C, typename = EnableIfContainer<C>,
+ typename = std::enable_if_t<std::is_const<T>::value, C>>
Span(const C &container) : data_(container.data()), size_(container.size()) {}
- template <
- typename C, typename = EnableIfContainer<C>,
- typename = typename std::enable_if<!std::is_const<T>::value, C>::type>
+ template <typename C, typename = EnableIfContainer<C>,
+ typename = std::enable_if_t<!std::is_const<T>::value, C>>
explicit Span(C &container)
: data_(container.data()), size_(container.size()) {}
diff --git a/include/openssl/stack.h b/include/openssl/stack.h
index 04e942c..df54713 100644
--- a/include/openssl/stack.h
+++ b/include/openssl/stack.h
@@ -443,16 +443,14 @@
// Stacks defined with |DEFINE_CONST_STACK_OF| are freed with |sk_free|.
template <typename Stack>
-struct DeleterImpl<
- Stack, typename std::enable_if<StackTraits<Stack>::kIsConst>::type> {
+struct DeleterImpl<Stack, std::enable_if_t<StackTraits<Stack>::kIsConst>> {
static void Free(Stack *sk) { sk_free(reinterpret_cast<_STACK *>(sk)); }
};
// Stacks defined with |DEFINE_STACK_OF| are freed with |sk_pop_free| and the
// corresponding type's deleter.
template <typename Stack>
-struct DeleterImpl<
- Stack, typename std::enable_if<!StackTraits<Stack>::kIsConst>::type> {
+struct DeleterImpl<Stack, std::enable_if_t<!StackTraits<Stack>::kIsConst>> {
static void Free(Stack *sk) {
// sk_FOO_pop_free is defined by macros and bound by name, so we cannot
// access it from C++ here.
@@ -502,18 +500,17 @@
};
template <typename Stack>
-using StackIterator = typename std::enable_if<StackTraits<Stack>::kIsStack,
- StackIteratorImpl<Stack>>::type;
+using StackIterator =
+ std::enable_if_t<StackTraits<Stack>::kIsStack, StackIteratorImpl<Stack>>;
} // namespace internal
// PushToStack pushes |elem| to |sk|. It returns true on success and false on
// allocation failure.
template <typename Stack>
-inline
- typename std::enable_if<!internal::StackTraits<Stack>::kIsConst, bool>::type
- PushToStack(Stack *sk,
- UniquePtr<typename internal::StackTraits<Stack>::Type> elem) {
+inline std::enable_if_t<!internal::StackTraits<Stack>::kIsConst, bool>
+PushToStack(Stack *sk,
+ UniquePtr<typename internal::StackTraits<Stack>::Type> elem) {
if (!sk_push(reinterpret_cast<_STACK *>(sk), elem.get())) {
return false;
}