Fix narrowing in Qt::endPropertyUpdateGroup()

decltype(QPropertyDelayedNotifications::used) is qsizetype, not int,
so don't use int to count from 0...used.  The notify() and
evaluateBinding() functions use their int argument only for pointer
arithmetic, so this is completely self-contained.

Amends fdedcb6ec650236bef4a8c8f005b5dd24ef7d77a.

Manual conflict resolutions:
  - evaluateBindings() returns void in 6.2

Task-number: QTBUG-103532
Task-number: QTBUG-110710
Change-Id: I765a06628d330fbb57a2fbecc96d66690bb62f13
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit d257a56c93e58028031c41daf90d3d4e8f317846)
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
Marc Mutz 2023-02-05 18:43:09 +01:00
parent 9687415262
commit e04ab02b64

View File

@ -154,7 +154,7 @@ struct QPropertyDelayedNotifications
Change notifications are sent later with notify (following the logic of separating Change notifications are sent later with notify (following the logic of separating
binding updates and notifications used in non-deferred updates). binding updates and notifications used in non-deferred updates).
*/ */
void evaluateBindings(int index, QBindingStatus *status) { void evaluateBindings(qsizetype index, QBindingStatus *status) {
auto *delayed = delayedProperties + index; auto *delayed = delayedProperties + index;
auto *bindingData = delayed->originalBindingData; auto *bindingData = delayed->originalBindingData;
if (!bindingData) if (!bindingData)
@ -182,7 +182,7 @@ struct QPropertyDelayedNotifications
\li sends any pending notifications. \li sends any pending notifications.
\endlist \endlist
*/ */
void notify(int index) { void notify(qsizetype index) {
auto *delayed = delayedProperties + index; auto *delayed = delayedProperties + index;
auto *bindingData = delayed->originalBindingData; auto *bindingData = delayed->originalBindingData;
if (!bindingData) if (!bindingData)
@ -252,14 +252,14 @@ void Qt::endPropertyUpdateGroup()
// update all delayed properties // update all delayed properties
auto start = data; auto start = data;
while (data) { while (data) {
for (int i = 0; i < data->used; ++i) for (qsizetype i = 0; i < data->used; ++i)
data->evaluateBindings(i, status); data->evaluateBindings(i, status);
data = data->next; data = data->next;
} }
// notify all delayed properties // notify all delayed properties
data = start; data = start;
while (data) { while (data) {
for (int i = 0; i < data->used; ++i) for (qsizetype i = 0; i < data->used; ++i)
data->notify(i); data->notify(i);
auto *next = data->next; auto *next = data->next;
delete data; delete data;