summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qdatastream.cpp6
-rw-r--r--tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp44
2 files changed, 49 insertions, 1 deletions
diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp
index 9a71f60854..5e5e155534 100644
--- a/src/corelib/io/qdatastream.cpp
+++ b/src/corelib/io/qdatastream.cpp
@@ -1046,8 +1046,12 @@ QDataStream &QDataStream::operator<<(float f)
} x;
x.val1 = g;
x.val2 = qbswap(x.val2);
- g = x.val1;
+
+ if (dev->write((char *)&x.val2, sizeof(float)) != sizeof(float))
+ q_status = WriteFailed;
+ return *this;
}
+
if (dev->write((char *)&g, sizeof(float)) != sizeof(float))
q_status = WriteFailed;
return *this;
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;