summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/io/qdatastream
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2012-11-13 19:17:17 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-23 02:32:19 +0100
commit3f936e9094f3a6e4d76791c1eff7ae92f91b61ae (patch)
treed4eb081fc8f3d50fab7cf6b624b65b3380af41fc /tests/auto/corelib/io/qdatastream
parentdc2fd227abe2508f2c8329623c4342800a107147 (diff)
Fixes problem with single precision floats in QDataStream (Windows).
When the floating-point behavior in MSVC is set to "precise" (default), assigning nan numbers to a float causes the bit pattern to be altered (only affects 32bit builds). We should therefore not assign the swapped value back to a float and use it. Task-number: QTBUG-25950 Change-Id: I7b6cc4d546e5c8aeafdede749056358b7d639ec7 Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Diffstat (limited to 'tests/auto/corelib/io/qdatastream')
-rw-r--r--tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
index ef384f86cd..f999f44670 100644
--- a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
+++ b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
@@ -195,6 +195,8 @@ private slots:
void compatibility_Qt3();
void compatibility_Qt2();
+ void floatingPointNaN();
+
private:
void writebool(QDataStream *s);
void writeQBitArray(QDataStream *s);
@@ -3102,6 +3104,48 @@ void tst_QDataStream::compatibility_Qt2()
QVERIFY(in_palette.color(QPalette::Light) == Qt::green);
}
+void tst_QDataStream::floatingPointNaN()
+{
+ QDataStream::ByteOrder bo = QSysInfo::ByteOrder == QSysInfo::BigEndian
+ ? QDataStream::LittleEndian
+ : QDataStream::BigEndian;
+
+ // Test and verify that values that become (s)nan's after swapping endianness
+ // don't change in the process.
+ // When compiling with e.g., MSVC (32bit) and when the fpu is used (fp:precise)
+ // all snan's will be converted to qnan's (default behavior).
+ // IF we get a snan after swapping endianness we can not copy the value to another
+ // float as this will cause the value to differ from the original value.
+ QByteArray ba;
+
+ union {
+ float f;
+ quint32 i;
+ } xs[2];
+
+ xs[0].i = qbswap<quint32>(0xff800001);
+ xs[1].i = qbswap<quint32>(0x7f800001);
+
+ {
+ QDataStream stream(&ba, QIODevice::WriteOnly);
+ stream.setByteOrder(bo);
+ stream.setFloatingPointPrecision(QDataStream::SinglePrecision);
+ stream << xs[0].f;
+ stream << xs[1].f;
+ }
+
+ {
+ QDataStream stream(ba);
+ stream.setByteOrder(bo);
+ stream.setFloatingPointPrecision(QDataStream::SinglePrecision);
+ float fr = 0.0f;
+ stream >> fr;
+ QCOMPARE(fr, xs[0].f);
+ stream >> fr;
+ QCOMPARE(fr, xs[1].f);
+ }
+}
+
void tst_QDataStream::floatingPointPrecision()
{
QByteArray ba;