[libcxx-commits] [libcxx] 3df1a64 - [libc++] Add a test for std::ssize's SFINAE
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Sep 6 16:42:26 PDT 2023
Author: Arthur O'Dwyer
Date: 2023-09-06T19:40:50-04:00
New Revision: 3df1a64ebad8f31231ba05cf6ff43a985fea9235
URL: https://github.com/llvm/llvm-project/commit/3df1a64ebad8f31231ba05cf6ff43a985fea9235
DIFF: https://github.com/llvm/llvm-project/commit/3df1a64ebad8f31231ba05cf6ff43a985fea9235.diff
LOG: [libc++] Add a test for std::ssize's SFINAE
Inspired by https://reviews.llvm.org/D120684#inline-1157644 and
subsequent LWG discussion. See http://wg21.link/LWG3207 for
additional context.
Differential Revision: https://reviews.llvm.org/D121154
Co-authored-by: Louis Dionne <ldionne.2 at gmail.com>
Added:
libcxx/test/std/iterators/iterator.container/ssize.LWG3207.compile.pass.cpp
Modified:
Removed:
################################################################################
diff --git a/libcxx/test/std/iterators/iterator.container/ssize.LWG3207.compile.pass.cpp b/libcxx/test/std/iterators/iterator.container/ssize.LWG3207.compile.pass.cpp
new file mode 100644
index 000000000000000..e97020f9440ca19
--- /dev/null
+++ b/libcxx/test/std/iterators/iterator.container/ssize.LWG3207.compile.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// <iterator>
+
+// template <class T, ptr
diff _t N>
+// constexpr ptr
diff _t ssize(const T (&array)[N]) noexcept;
+//
+// This test checks that the library implements LWG3207 as not-a-defect.
+// `clang -m32` is an example of a configuration where using ptr
diff _t
+// instead of size_t in std::ssize has an observable SFINAE effect.
+//
+// REQUIRES: 32-bit-pointer
+
+#include <iterator>
+#include <climits>
+#include <cstddef>
+
+// Test the test:
+static_assert(sizeof(std::ptr
diff _t) == 4, "Run only on these platforms");
+static_assert(sizeof(std::size_t) == 4, "Run only on these platforms");
+static_assert(std::size_t(PTRDIFF_MAX) + 1 > std::size_t(PTRDIFF_MAX), "This should always be true");
+extern char forming_this_type_must_be_valid_on_this_platform[std::size_t(PTRDIFF_MAX) + 1];
+
+// The actual test:
+template <class T>
+concept HasSsize = requires(T&& t) { std::ssize(t); };
+
+static_assert(HasSsize<char[std::size_t(PTRDIFF_MAX)]>);
+static_assert(!HasSsize<char[std::size_t(PTRDIFF_MAX) + 1]>);
More information about the libcxx-commits
mailing list