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

            Bug ID: 104243
           Summary: Optimization requires __sync_synchronize
           Product: gcc
           Version: 6.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: aklitzing at gmail dot com
  Target Milestone: ---

Hi,

long time ago I found a strange behaviour with Qt and GCC 6.3. I tried it again
today with GCC 11.1.0.

If I compile this snippet with an optimization level it will output "broken".
If I use -O0 or use clang it will output "ok".
If I add "__sync_synchronize" it will work with any optimization, too. The
variable "idx" isn't updated in if-clause but it seems updated if qDebug is
called.


#include <QVersionNumber>
#include <QDebug>

int main(int argc, char** argv)
{
        const QString pVersion = QStringLiteral("1.12.2");
        int idx = 0;
        const auto& version = QVersionNumber::fromString(pVersion, &idx);

        // #ifdef Q_CC_GNU
        // __sync_synchronize();
        // #endif

        if(idx == 0)
                qDebug() << "broken";
        else
                qDebug() << "ok";

        qDebug() << "idx:" << idx;
        return 0;
}

$ g++ -O2 example.cpp `pkg-config --libs --cflags Qt5Core`
$ ./a.out
broken
idx: 6

$ g++ -O0 bla.cpp `pkg-config --libs --cflags Qt5Core`
$ ./a.out
ok
idx: 6


Source of QVersionNumber:
https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/tools/qversionnumber.cpp?h=5.15.2#n463

Qt-Report:
https://bugreports.qt.io/browse/QTBUG-62185

Reply via email to