https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120358

--- Comment #18 from Holger Hoffstätte <hol...@applied-asynchrony.com> ---
Furthermore, using an explicit std::move to the first test like this:

    auto joined = expected.join(u'.');
    auto tok = qTokenize(std::move(joined), QLatin1Char('.'),
Qt::CaseSensitive, Qt::SkipEmptyParts);

results in *both* tests using HaystackPinning and working as expected - though
in the second case that might be accidental state reuse, which is also
concerning:

Breakpoint 1, dump<QStringTokenizer<QString, QChar> > (tok=...) at
/usr/include/qt6/QtCore/qstringtokenizer.h:377
377     auto QStringTokenizerBase<Haystack, Needle>::next(tokenizer_state
state) const noexcept -> next_result
(gdb) p tok
$6 = (QStringTokenizer<QString, QChar> &) @0x7fffffffde40:
{<QtPrivate::Tok::HaystackPinning<QString>> =
{<QtPrivate::Tok::Pinning<QString, true>> = {m_string = {d = {
          d = 0x55555556f640, ptr = 0x55555556f650 u"a.ab.abc.abcd.abcde", 
          size = 19}}}, <No data fields>},
<QtPrivate::Tok::NeedlePinning<QChar>> = {<QtPrivate::Tok::Pinning<QChar,
false>> = {<No data fields>}, <No data fields>},
<QStringTokenizerBase<QStringView, QChar>> = {<QStringTokenizerBaseBase> = {
      m_sb = {<QtPrivate::QFlagsStorageHelper<Qt::SplitBehaviorFlags, 4>> =
{<QtPrivate::QFlagsStorage<Qt::SplitBehaviorFlags>> = {static IntegerSize = 4, 
            i = 1}, <No data fields>}, <No data fields>}, m_cs =
Qt::CaseSensitive}, m_haystack = {m_size = 19, m_data = 0x55555556f650
u"a.ab.abc.abcd.abcde"}, m_needle = {
      ucs = 46 u'.'}}, <No data fields>}
(gdb) c
Continuing.
1 2 3 4 5 

Breakpoint 1, dump<QStringTokenizer<QString, QChar> > (tok=...) at
/usr/include/qt6/QtCore/qstringtokenizer.h:377
377     auto QStringTokenizerBase<Haystack, Needle>::next(tokenizer_state
state) const noexcept -> next_result
(gdb) p tok
$7 = (QStringTokenizer<QString, QChar> &) @0x7fffffffde40:
{<QtPrivate::Tok::HaystackPinning<QString>> =
{<QtPrivate::Tok::Pinning<QString, true>> = {m_string = {d = {
          d = 0x55555556f640, ptr = 0x55555556f650 u"a.ab.abc.abcd.abcde", 
          size = 19}}}, <No data fields>},
<QtPrivate::Tok::NeedlePinning<QChar>> = {<QtPrivate::Tok::Pinning<QChar,
false>> = {<No data fields>}, <No data fields>},
<QStringTokenizerBase<QStringView, QChar>> = {<QStringTokenizerBaseBase> = {
      m_sb = {<QtPrivate::QFlagsStorageHelper<Qt::SplitBehaviorFlags, 4>> =
{<QtPrivate::QFlagsStorage<Qt::SplitBehaviorFlags>> = {static IntegerSize = 4, 
            i = 1}, <No data fields>}, <No data fields>}, m_cs =
Qt::CaseSensitive}, m_haystack = {m_size = 19, m_data = 0x55555556f650
u"a.ab.abc.abcd.abcde"}, m_needle = {
      ucs = 46 u'.'}}, <No data fields>}
(gdb) c
Continuing.
1 2 3 4 5 

Consequently the problematic second test (testNotOK) can be "fixed" by:

  auto tok = qTokenize(std::move(expected.join(u'.')), QLatin1Char('.'),
Qt::CaseSensitive, Qt::SkipEmptyParts);

Hope this helps.

Reply via email to