Skip to content

Commit

Permalink
tst_QSpan: check QList<int> -> QSpan<const int> doesn't detach the fo…
Browse files Browse the repository at this point in the history
…rmer

It does.

While std::span, does, too, and so users should be using
std::as_const(), it's quite simple to avoid for QSpan, so we'll fix it
in QSpan. This patch adds the reproducer.

Task-number: QTBUG-132133
Pick-to: 6.8
Change-Id: I2e416fb7344830cd5e0d945cce61491cd6f4a7a5
Reviewed-by: Giuseppe D'Angelo <[email protected]>
Reviewed-by: Thiago Macieira <[email protected]>
(cherry picked from commit 05b9a4b)
Reviewed-by: Qt Cherry-pick Bot <[email protected]>
  • Loading branch information
marcmutz authored and Qt Cherry-pick Bot committed Dec 24, 2024
1 parent b610831 commit aff0827
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions tests/auto/corelib/tools/qspan/tst_qspan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ private Q_SLOTS:
void fromQList() const;
void fromInitList() const;

void constQSpansDontDetachQtContainers() const;

private:
template <typename T, std::size_t N, typename S, std::size_t M>
void check_identical(QSpan<T, N> lhs, QSpan<S, M> rhs) const;
Expand Down Expand Up @@ -468,6 +470,32 @@ void tst_QSpan::fromQList() const
from_variable_size_container_impl(li);
}

void tst_QSpan::constQSpansDontDetachQtContainers() const
{
QList<int> li = {42, 84, 168, 336};

{
[[maybe_unused]] const QList copy = li;
QVERIFY(!li.isDetached());
[[maybe_unused]] QSpan<const int> cvspan = li; // should not detach (QTBUG-132133)
QEXPECT_FAIL("", "QTBUG-132133", Continue);
QVERIFY(!li.isDetached());
[[maybe_unused]] QSpan<int> mvspan = li; // this _has_ to detach, though
QVERIFY(li.isDetached());
}

// same check for fixed-size spans
{
[[maybe_unused]] const QList copy = li;
QVERIFY(!li.isDetached());
[[maybe_unused]] QSpan<const int, 4> cfspan = li; // should not detach (QTBUG-132133)
QEXPECT_FAIL("", "QTBUG-132133", Continue);
QVERIFY(!li.isDetached());
[[maybe_unused]] QSpan<int, 4> mfspan = li; // this _has_ to detach, though
QVERIFY(li.isDetached());
}
}

void tst_QSpan::fromInitList() const
{
from_variable_size_container_impl(std::initializer_list<int>{42, 84, 168, 336});
Expand Down

0 comments on commit aff0827

Please sign in to comment.