[Lldb-commits] [flang] [lldb] [libcxx] [clang-tools-extra] [clang] [compiler-rt] [mlir] [libc] [openmp] [llvm] [libc++][span] P2821R5: `span.at()` (PR #74994)
https://github.com/H-G-Hristov updated https://github.com/llvm/llvm-project/pull/74994 >From 6e26ca239c49e1b7d9ab72217db7339e92df163f Mon Sep 17 00:00:00 2001 From: Zingam Date: Sun, 10 Dec 2023 14:16:02 +0200 Subject: [PATCH 01/17] [libc++][span] P2821R5: span.at() --- libcxx/include/span | 30 +++ .../views/views.span/span.elem/at.pass.cpp| 246 ++ .../views.span/span.elem/op_idx.pass.cpp | 1 - 3 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp diff --git a/libcxx/include/span b/libcxx/include/span index 69b0a2875e26cc..b015d7cf1c15b6 100644 --- a/libcxx/include/span +++ b/libcxx/include/span @@ -92,6 +92,7 @@ public: // [span.elem], span element access constexpr reference operator[](size_type idx) const; +constexpr reference at(size_type idx) const; // since C++26 constexpr reference front() const; constexpr reference back() const; constexpr pointer data() const noexcept; @@ -146,6 +147,9 @@ template #include <__utility/forward.h> #include // for array #include // for byte +#if _LIBCPP_STD_VER >= 26 +# include +#endif #include // standard-mandated includes @@ -343,6 +347,15 @@ public: return __data_[__idx]; } +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __idx) const { + if (__idx >= size()) { +__throw_out_of_range(); + } + return *(data() + __idx); +} +# endif + _LIBCPP_INLINE_VISIBILITY constexpr reference front() const noexcept { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span::front() on empty span"); @@ -383,6 +396,10 @@ public: private: pointer__data_; + +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range() const { std::__throw_out_of_range("span"); } +# endif }; @@ -510,6 +527,15 @@ public: return __data_[__idx]; } +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __idx) const { + if (__idx >= size()) { +__throw_out_of_range(); + } + return *(data() + __idx); +} +# endif + _LIBCPP_INLINE_VISIBILITY constexpr reference front() const noexcept { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span::front() on empty span"); @@ -552,6 +578,10 @@ public: private: pointer __data_; size_type __size_; + +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range() const { std::__throw_out_of_range("span"); } +# endif }; template diff --git a/libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp b/libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp new file mode 100644 index 00..2a9ce2baeec1a5 --- /dev/null +++ b/libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp @@ -0,0 +1,246 @@ +//===--===// +// +// 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, c++20, c++23 + +// + +// constexpr reference at(size_type idx) const; // since C++26 + +#include +#include +#include +#include +#include +#include + +#include "test_macros.h" + +// template +// constexpr bool testConstexprSpan(Span sp, std::size_t idx) +// { +// LIBCPP_ASSERT(noexcept(sp[idx])); + +// typename Span::reference r1 = sp[idx]; +// typename Span::reference r2 = *(sp.data() + idx); + +// return r1 == r2; +// } + +// template +// void testRuntimeSpan(Span sp, std::size_t idx) +// { +// LIBCPP_ASSERT(noexcept(sp[idx])); + +// typename Span::reference r1 = sp[idx]; +// typename Span::reference r2 = *(sp.data() + idx); + +// assert(r1 == r2); +// } + +// struct A{}; +// constexpr int iArr1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; +// int iArr2[] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; + +// int main(int, char**) +// { +// static_assert(testConstexprSpan(std::span(iArr1, 1), 0), ""); + +// static_assert(testConstexprSpan(std::span(iArr1, 2), 0), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 2), 1), ""); + +// static_assert(testConstexprSpan(std::span(iArr1, 3), 0), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 3), 1), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 3), 2), ""); + +// static_assert(testConstexprSpan(std::span(iArr1, 4), 0), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 4), 1), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 4), 2), ""); +// static_assert(t
[Lldb-commits] [flang] [lldb] [libcxx] [clang-tools-extra] [clang] [compiler-rt] [mlir] [libc] [openmp] [llvm] [libc++][span] P2821R5: `span.at()` (PR #74994)
H-G-Hristov wrote: @philnik777 a gentle ping ...and Happy New Year! https://github.com/llvm/llvm-project/pull/74994 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Implement WebAssembly debugging (PR #76683)
https://github.com/paolosevMSFT created https://github.com/llvm/llvm-project/pull/76683 Add support for source-level debugging of WebAssembly code. >From 739b26b03fd3661d1c22b975e241cbbe60ca6531 Mon Sep 17 00:00:00 2001 From: Paolo Severini Date: Mon, 1 Jan 2024 06:55:40 -0800 Subject: [PATCH] [lldb] Implement WebAssembly debugging Add support for source-level debugging of WebAssembly code. --- lldb/include/lldb/Target/Process.h| 40 +++ lldb/include/lldb/Target/UnwindWasm.h | 47 +++ lldb/source/Core/Value.cpp| 2 +- lldb/source/Expression/DWARFExpression.cpp| 42 +++ .../source/Interpreter/CommandInterpreter.cpp | 18 ++ lldb/source/Plugins/Process/CMakeLists.txt| 1 + .../Process/gdb-remote/ProcessGDBRemote.cpp | 7 +- .../Process/gdb-remote/ProcessGDBRemote.h | 2 + .../Plugins/Process/wasm/CMakeLists.txt | 15 + .../Plugins/Process/wasm/ProcessWasm.cpp | 296 ++ .../source/Plugins/Process/wasm/ProcessWasm.h | 135 .../Plugins/Process/wasm/ThreadWasm.cpp | 57 lldb/source/Plugins/Process/wasm/ThreadWasm.h | 47 +++ .../Plugins/Process/wasm/UnwindWasm.cpp | 79 + lldb/source/Plugins/Process/wasm/UnwindWasm.h | 58 .../Process/wasm/wasmRegisterContext.cpp | 103 ++ .../Process/wasm/wasmRegisterContext.h| 70 + lldb/source/Target/Platform.cpp | 8 + 18 files changed, 1025 insertions(+), 2 deletions(-) create mode 100644 lldb/include/lldb/Target/UnwindWasm.h create mode 100644 lldb/source/Plugins/Process/wasm/CMakeLists.txt create mode 100644 lldb/source/Plugins/Process/wasm/ProcessWasm.cpp create mode 100644 lldb/source/Plugins/Process/wasm/ProcessWasm.h create mode 100644 lldb/source/Plugins/Process/wasm/ThreadWasm.cpp create mode 100644 lldb/source/Plugins/Process/wasm/ThreadWasm.h create mode 100644 lldb/source/Plugins/Process/wasm/UnwindWasm.cpp create mode 100644 lldb/source/Plugins/Process/wasm/UnwindWasm.h create mode 100644 lldb/source/Plugins/Process/wasm/wasmRegisterContext.cpp create mode 100644 lldb/source/Plugins/Process/wasm/wasmRegisterContext.h diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index 24c599e044c78f..587ae085b479b7 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -1548,6 +1548,46 @@ class Process : public std::enable_shared_from_this, virtual size_t ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error); + /// Read of memory from a process. + /// + /// This function will read memory from the current process's address space + /// and remove any traps that may have been inserted into the memory. + /// + /// This overloads accepts an ExecutionContext as additional argument. By + /// default, it calls the previous overload without the ExecutionContext + /// argument, but it can be overridden by Process subclasses. + /// + /// \param[in] vm_addr + /// A virtual load address that indicates where to start reading + /// memory from. + /// + /// \param[out] buf + /// A byte buffer that is at least \a size bytes long that + /// will receive the memory bytes. + /// + /// \param[in] size + /// The number of bytes to read. + /// + /// \param[in] exe_ctx + ///The current execution context, if available. + /// + /// \param[out] error + /// An error that indicates the success or failure of this + /// operation. If error indicates success (error.Success()), + /// then the value returned can be trusted, otherwise zero + /// will be returned. + /// + /// \return + /// The number of bytes that were actually read into \a buf. If + /// the returned number is greater than zero, yet less than \a + /// size, then this function will get called again with \a + /// vm_addr, \a buf, and \a size updated appropriately. Zero is + /// returned in the case of an error. + virtual size_t ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, +ExecutionContext *exe_ctx, Status &error) { +return ReadMemory(vm_addr, buf, size, error); + } + /// Read of memory from a process. /// /// This function has the same semantics of ReadMemory except that it diff --git a/lldb/include/lldb/Target/UnwindWasm.h b/lldb/include/lldb/Target/UnwindWasm.h new file mode 100644 index 00..3880f1dd62edf2 --- /dev/null +++ b/lldb/include/lldb/Target/UnwindWasm.h @@ -0,0 +1,47 @@ +//===-- UnwindWasm.h *- C++ -*-===// +// +// 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 +// +//===--===// + +#ifndef LLDB_TARGET_
[Lldb-commits] [lldb] [lldb] Implement WebAssembly debugging (PR #76683)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 25cd249355b0f3192ca5b0c69514ad68a1cb8897 739b26b03fd3661d1c22b975e241cbbe60ca6531 -- lldb/include/lldb/Target/UnwindWasm.h lldb/source/Plugins/Process/wasm/ProcessWasm.cpp lldb/source/Plugins/Process/wasm/ProcessWasm.h lldb/source/Plugins/Process/wasm/ThreadWasm.cpp lldb/source/Plugins/Process/wasm/ThreadWasm.h lldb/source/Plugins/Process/wasm/UnwindWasm.cpp lldb/source/Plugins/Process/wasm/UnwindWasm.h lldb/source/Plugins/Process/wasm/wasmRegisterContext.cpp lldb/source/Plugins/Process/wasm/wasmRegisterContext.h lldb/include/lldb/Target/Process.h lldb/source/Core/Value.cpp lldb/source/Expression/DWARFExpression.cpp lldb/source/Interpreter/CommandInterpreter.cpp lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h lldb/source/Target/Platform.cpp `` View the diff from clang-format here. ``diff diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 1693e390c2..8e8ea610b8 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -350,8 +350,7 @@ static offset_t GetOpcodeDataSize(const DataExtractor &data, uint8_t wasm_op = data.GetU8(&offset); if (wasm_op == 3) { data.GetU32(&offset); -} -else { +} else { data.GetULEB128(&offset); } return offset - data_offset; @@ -2612,13 +2611,13 @@ bool DWARFExpression::Evaluate( /* LLDB doesn't have an address space to represents WebAssembly Locals, * GLobals and operand stacks. - * We encode these elements into virtual registers: + * We encode these elements into virtual registers: * | tag: 2 bits | index: 30 bits | * where tag is: *0: Not a WebAssembly location *1: Local *2: Global - *3: Operand stack value + *3: Operand stack value */ if (wasm_op == 3) { index = opcodes.GetU32(&offset); diff --git a/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp b/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp index 1c1f9885b6..275248a1ef 100644 --- a/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp +++ b/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp @@ -73,7 +73,7 @@ lldb::ProcessSP ProcessWasm::CreateInstance(lldb::TargetSP target_sp, } bool ProcessWasm::CanDebug(lldb::TargetSP target_sp, -bool plugin_specified_by_name) { + bool plugin_specified_by_name) { if (plugin_specified_by_name) return true; @@ -144,7 +144,7 @@ size_t ProcessWasm::ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, } size_t ProcessWasm::WasmReadMemory(uint32_t wasm_module_id, lldb::addr_t addr, - void *buf, size_t buffer_size) { + void *buf, size_t buffer_size) { char packet[64]; int packet_len = ::snprintf(packet, sizeof(packet), "qWasmMem:%d;%" PRIx64 ";%" PRIx64, @@ -153,7 +153,8 @@ size_t ProcessWasm::WasmReadMemory(uint32_t wasm_module_id, lldb::addr_t addr, assert(packet_len + 1 < (int)sizeof(packet)); UNUSED_IF_ASSERT_DISABLED(packet_len); StringExtractorGDBRemote response; - if (m_gdb_comm.SendPacketAndWaitForResponse(packet, response, GetInterruptTimeout()) == + if (m_gdb_comm.SendPacketAndWaitForResponse(packet, response, + GetInterruptTimeout()) == GDBRemoteCommunication::PacketResult::Success) { if (response.IsNormalResponse()) { return response.GetHexBytes(llvm::MutableArrayRef( @@ -165,7 +166,7 @@ size_t ProcessWasm::WasmReadMemory(uint32_t wasm_module_id, lldb::addr_t addr, } size_t ProcessWasm::WasmReadData(uint32_t wasm_module_id, lldb::addr_t addr, - void *buf, size_t buffer_size) { + void *buf, size_t buffer_size) { char packet[64]; int packet_len = ::snprintf(packet, sizeof(packet), "qWasmData:%d;%" PRIx64 ";%" PRIx64, @@ -174,7 +175,8 @@ size_t ProcessWasm::WasmReadData(uint32_t wasm_module_id, lldb::addr_t addr, assert(packet_len + 1 < (int)sizeof(packet)); UNUSED_IF_ASSERT_DISABLED(packet_len); StringExtractorGDBRemote response; - if (m_gdb_comm.SendPacketAndWaitForResponse(packet, response, GetInterruptTimeout()) == + if (m_gdb_comm.SendPacketAndWaitForResponse(packet, response, + GetInterruptTimeout()) == GDBRemoteCommunication::PacketResult::Success) { if (response.IsNormalResponse()) { return response.GetHexBytes(llvm::MutableArrayRef( diff --git a/lldb/source/Plugins/Process/wasm/ProcessWasm.h b/lldb
[Lldb-commits] [compiler-rt] [clang] [libcxx] [lldb] [mlir] [llvm] [libc] [openmp] [flang] [clang-tools-extra] [libc++][span] P2821R5: `span.at()` (PR #74994)
https://github.com/philnik777 approved this pull request. Other than the test this LGTM. https://github.com/llvm/llvm-project/pull/74994 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [llvm] [compiler-rt] [libcxx] [libc] [openmp] [lldb] [mlir] [clang] [flang] [clang-tools-extra] [libc++][span] P2821R5: `span.at()` (PR #74994)
@@ -0,0 +1,136 @@ +//===--===// +// +// 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, c++20, c++23 + +// + +// constexpr reference at(size_type idx) const; // since C++26 + +#include +#include +#include +#include +#include +#include +#include + +#include "test_macros.h" + +constexpr void testSpanAt(auto span, int idx, int expectedValue) { + // non-const + { +std::same_as decltype(auto) elem = span.at(idx); +assert(elem == expectedValue); + } + + // const + { +std::same_as decltype(auto) elem = std::as_const(span).at(idx); +assert(elem == expectedValue); + } +} + +constexpr bool test() { + // With static extent + { +std::array arr{0, 1, 2, 3, 4, 5, 9084}; +std::span arrSpan{arr}; + +assert(std::dynamic_extent != arrSpan.extent); + +testSpanAt(arrSpan, 0, 0); +testSpanAt(arrSpan, 1, 1); +testSpanAt(arrSpan, 6, 9084); + } + + // With dynamic extent + { +std::vector vec{0, 1, 2, 3, 4, 5, 9084}; +std::span vecSpan{vec}; + +assert(std::dynamic_extent == vecSpan.extent); + +testSpanAt(vecSpan, 0, 0); +testSpanAt(vecSpan, 1, 1); +testSpanAt(vecSpan, 6, 9084); + } + + return true; +} + +void test_exceptions() { philnik777 wrote: I don't think you've addressed this? https://github.com/llvm/llvm-project/pull/74994 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [clang] [lldb] [flang] [libcxx] [openmp] [llvm] [compiler-rt] [clang-tools-extra] [mlir] [libc] [libc++][span] P2821R5: `span.at()` (PR #74994)
https://github.com/philnik777 edited https://github.com/llvm/llvm-project/pull/74994 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [llvm] [openmp] [libc] [libcxx] [clang-tools-extra] [mlir] [flang] [clang] [compiler-rt] [libc++][span] P2821R5: `span.at()` (PR #74994)
https://github.com/H-G-Hristov updated https://github.com/llvm/llvm-project/pull/74994 >From 6e26ca239c49e1b7d9ab72217db7339e92df163f Mon Sep 17 00:00:00 2001 From: Zingam Date: Sun, 10 Dec 2023 14:16:02 +0200 Subject: [PATCH 01/18] [libc++][span] P2821R5: span.at() --- libcxx/include/span | 30 +++ .../views/views.span/span.elem/at.pass.cpp| 246 ++ .../views.span/span.elem/op_idx.pass.cpp | 1 - 3 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp diff --git a/libcxx/include/span b/libcxx/include/span index 69b0a2875e26cc..b015d7cf1c15b6 100644 --- a/libcxx/include/span +++ b/libcxx/include/span @@ -92,6 +92,7 @@ public: // [span.elem], span element access constexpr reference operator[](size_type idx) const; +constexpr reference at(size_type idx) const; // since C++26 constexpr reference front() const; constexpr reference back() const; constexpr pointer data() const noexcept; @@ -146,6 +147,9 @@ template #include <__utility/forward.h> #include // for array #include // for byte +#if _LIBCPP_STD_VER >= 26 +# include +#endif #include // standard-mandated includes @@ -343,6 +347,15 @@ public: return __data_[__idx]; } +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __idx) const { + if (__idx >= size()) { +__throw_out_of_range(); + } + return *(data() + __idx); +} +# endif + _LIBCPP_INLINE_VISIBILITY constexpr reference front() const noexcept { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span::front() on empty span"); @@ -383,6 +396,10 @@ public: private: pointer__data_; + +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range() const { std::__throw_out_of_range("span"); } +# endif }; @@ -510,6 +527,15 @@ public: return __data_[__idx]; } +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __idx) const { + if (__idx >= size()) { +__throw_out_of_range(); + } + return *(data() + __idx); +} +# endif + _LIBCPP_INLINE_VISIBILITY constexpr reference front() const noexcept { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span::front() on empty span"); @@ -552,6 +578,10 @@ public: private: pointer __data_; size_type __size_; + +# if _LIBCPP_STD_VER >= 26 +_LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range() const { std::__throw_out_of_range("span"); } +# endif }; template diff --git a/libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp b/libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp new file mode 100644 index 00..2a9ce2baeec1a5 --- /dev/null +++ b/libcxx/test/std/containers/views/views.span/span.elem/at.pass.cpp @@ -0,0 +1,246 @@ +//===--===// +// +// 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, c++20, c++23 + +// + +// constexpr reference at(size_type idx) const; // since C++26 + +#include +#include +#include +#include +#include +#include + +#include "test_macros.h" + +// template +// constexpr bool testConstexprSpan(Span sp, std::size_t idx) +// { +// LIBCPP_ASSERT(noexcept(sp[idx])); + +// typename Span::reference r1 = sp[idx]; +// typename Span::reference r2 = *(sp.data() + idx); + +// return r1 == r2; +// } + +// template +// void testRuntimeSpan(Span sp, std::size_t idx) +// { +// LIBCPP_ASSERT(noexcept(sp[idx])); + +// typename Span::reference r1 = sp[idx]; +// typename Span::reference r2 = *(sp.data() + idx); + +// assert(r1 == r2); +// } + +// struct A{}; +// constexpr int iArr1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; +// int iArr2[] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; + +// int main(int, char**) +// { +// static_assert(testConstexprSpan(std::span(iArr1, 1), 0), ""); + +// static_assert(testConstexprSpan(std::span(iArr1, 2), 0), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 2), 1), ""); + +// static_assert(testConstexprSpan(std::span(iArr1, 3), 0), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 3), 1), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 3), 2), ""); + +// static_assert(testConstexprSpan(std::span(iArr1, 4), 0), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 4), 1), ""); +// static_assert(testConstexprSpan(std::span(iArr1, 4), 2), ""); +// static_assert(t
[Lldb-commits] [lldb] [llvm] [openmp] [libc] [libcxx] [clang-tools-extra] [mlir] [flang] [clang] [compiler-rt] [libc++][span] P2821R5: `span.at()` (PR #74994)
@@ -0,0 +1,136 @@ +//===--===// +// +// 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, c++20, c++23 + +// + +// constexpr reference at(size_type idx) const; // since C++26 + +#include +#include +#include +#include +#include +#include +#include + +#include "test_macros.h" + +constexpr void testSpanAt(auto span, int idx, int expectedValue) { + // non-const + { +std::same_as decltype(auto) elem = span.at(idx); +assert(elem == expectedValue); + } + + // const + { +std::same_as decltype(auto) elem = std::as_const(span).at(idx); +assert(elem == expectedValue); + } +} + +constexpr bool test() { + // With static extent + { +std::array arr{0, 1, 2, 3, 4, 5, 9084}; +std::span arrSpan{arr}; + +assert(std::dynamic_extent != arrSpan.extent); + +testSpanAt(arrSpan, 0, 0); +testSpanAt(arrSpan, 1, 1); +testSpanAt(arrSpan, 6, 9084); + } + + // With dynamic extent + { +std::vector vec{0, 1, 2, 3, 4, 5, 9084}; +std::span vecSpan{vec}; + +assert(std::dynamic_extent == vecSpan.extent); + +testSpanAt(vecSpan, 0, 0); +testSpanAt(vecSpan, 1, 1); +testSpanAt(vecSpan, 6, 9084); + } + + return true; +} + +void test_exceptions() { H-G-Hristov wrote: Sorry, I missed your comment! https://github.com/llvm/llvm-project/pull/74994 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [clang] [llvm] [openmp] [mlir] [libcxx] [libc] [lldb] [compiler-rt] [clang-tools-extra] [flang] [libc++][span] P2821R5: `span.at()` (PR #74994)
Zingam wrote: Thank you very much for the review. I'll wait a few days for addional feedback before I land this PR. https://github.com/llvm/llvm-project/pull/74994 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits