Fix aliasing bug when compiled with gcc 4.6
authorAaron Kennedy <aaron.kennedy@nokia.com>
Thu, 15 Sep 2011 08:52:27 +0000 (18:52 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 16 Sep 2011 04:37:43 +0000 (06:37 +0200)
Change-Id: I50dbeaed501ae498cd5c46e6e5929789b373b932
Task-number: QTBUG-21265
Reviewed-on: http://codereview.qt-project.org/4957
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
src/declarative/qml/qdeclarativenotifier_p.h

index 0781886..6119517 100644 (file)
@@ -99,8 +99,15 @@ private:
 
     enum { InvalidType, SignalType, NotifierType } type;
     union {
-        char signalData[sizeof(Signal)];
-        char notifierData[sizeof(Notifier)];
+        struct {
+            Signal *signal;
+            union {
+                char signalData[sizeof(Signal)];
+                qint64 q_for_alignment_1;
+                double q_for_alignment_2;
+            };
+        };
+        Notifier notifier;
     };
 
     inline Notifier *toNotifier();
@@ -194,7 +201,7 @@ void QDeclarativeNotifierEndpoint::connect(QDeclarativeNotifier *notifier)
 void QDeclarativeNotifierEndpoint::disconnect()
 {
     if (type == SignalType) {
-        Signal *s = (Signal *)&signalData;
+        Signal *s = asSignal();
         if (s->source) {
             QMetaObject::disconnectOne(s->source, s->sourceSignal, target, targetMethod);
             s->source = 0;
@@ -234,7 +241,8 @@ QDeclarativeNotifierEndpoint::Notifier *QDeclarativeNotifierEndpoint::toNotifier
 
 QDeclarativeNotifierEndpoint::Notifier *QDeclarativeNotifierEndpoint::asNotifier() 
 { 
-    return (Notifier *)(&notifierData); 
+    Q_ASSERT(type == NotifierType);
+    return &notifier;
 }
 
 QDeclarativeNotifierEndpoint::Signal *QDeclarativeNotifierEndpoint::toSignal()
@@ -243,16 +251,15 @@ QDeclarativeNotifierEndpoint::Signal *QDeclarativeNotifierEndpoint::toSignal()
         return asSignal();
 
     disconnect();
-    Signal *s = asSignal();
-    new (s) Signal;
+    signal = new (&signalData) Signal;
     type = SignalType;
-
-    return s;
+    return signal;
 }
 
 QDeclarativeNotifierEndpoint::Signal *QDeclarativeNotifierEndpoint::asSignal() 
 { 
-    return (Signal *)(&signalData); 
+    Q_ASSERT(type == SignalType);
+    return signal;
 }
 
 QT_END_NAMESPACE