Icon: work around compile optimization bug

We are observing that the strings become sequences of zeros in
release builds, possibly triggered by qOffsetStringArray being used
in a static constexpr function to initialize a constexpr array.

Pull the array out of the function as a static on translation unit level,
which is a pattern we use regularly elsewhere in Qt.

Pick-to: 6.7
Change-Id: I69c8cfe4e2d6d7d4659edda621ba1afe9768035b
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
This commit is contained in:
Volker Hilsheimer 2024-03-04 12:24:21 +01:00
parent f7194435f3
commit 302823d73b

View File

@ -1403,168 +1403,168 @@ bool QIcon::hasThemeIcon(const QString &name)
return icon.name() == name;
}
static constexpr auto themeIconMapping = qOffsetStringArray(
"address-book-new",
"application-exit",
"appointment-new",
"call-start",
"call-stop",
"contact-new",
"document-new",
"document-open",
"document-open-recent",
"document-page-setup",
"document-print",
"document-print-preview",
"document-properties",
"document-revert",
"document-save",
"document-save-as",
"document-send",
"edit-clear",
"edit-copy",
"edit-cut",
"edit-delete",
"edit-find",
"edit-paste",
"edit-redo",
"edit-select-all",
"edit-undo",
"folder-new",
"format-indent-less",
"format-indent-more",
"format-justify-center",
"format-justify-fill",
"format-justify-left",
"format-justify-right",
"format-text-direction-ltr",
"format-text-direction-rtl",
"format-text-bold",
"format-text-italic",
"format-text-underline",
"format-text-strikethrough",
"go-down",
"go-home",
"go-next",
"go-previous",
"go-up",
"help-about",
"help-faq",
"insert-image",
"insert-link",
"insert-text",
"list-add",
"list-remove",
"mail-forward",
"mail-mark-important",
"mail-mark-read",
"mail-mark-unread",
"mail-message-new",
"mail-reply-all",
"mail-reply-sender",
"mail-send",
"media-eject",
"media-playback-pause",
"media-playback-start",
"media-playback-stop",
"media-record",
"media-seek-backward",
"media-seek-forward",
"media-skip-backward",
"media-skip-forward",
"object-rotate-left",
"object-rotate-right",
"process-stop",
"system-lock-screen",
"system-log-out",
"system-search",
"system-reboot",
"system-shutdown",
"tools-check-spelling",
"view-fullscreen",
"view-refresh",
"view-restore",
"window-close",
"window-new",
"zoom-fit-best",
"zoom-in",
"zoom-out",
"audio-card",
"audio-input-microphone",
"battery",
"camera-photo",
"camera-video",
"camera-web",
"computer",
"drive-harddisk",
"drive-optical",
"input-gaming",
"input-keyboard",
"input-mouse",
"input-tablet",
"media-flash",
"media-optical",
"media-tape",
"multimedia-player",
"network-wired",
"network-wireless",
"phone",
"printer",
"scanner",
"video-display",
"appointment-missed",
"appointment-soon",
"audio-volume-high",
"audio-volume-low",
"audio-volume-medium",
"audio-volume-muted",
"battery-caution",
"battery-low",
"dialog-error",
"dialog-information",
"dialog-password",
"dialog-question",
"dialog-warning",
"folder-drag-accept",
"folder-open",
"folder-visiting",
"image-loading",
"image-missing",
"mail-attachment",
"mail-unread",
"mail-read",
"mail-replied",
"media-playlist-repeat",
"media-playlist-shuffle",
"network-offline",
"printer-printing",
"security-high",
"security-low",
"software-update-available",
"software-update-urgent",
"sync-error",
"sync-synchronizing",
"user-available",
"user-offline",
"weather-clear",
"weather-clear-night",
"weather-few-clouds",
"weather-few-clouds-night",
"weather-fog",
"weather-showers",
"weather-snow",
"weather-storm"
);
static_assert(QIcon::ThemeIcon::NThemeIcons == QIcon::ThemeIcon(themeIconMapping.count()));
static constexpr QLatin1StringView themeIconName(QIcon::ThemeIcon icon)
{
constexpr auto mapping = qOffsetStringArray(
"address-book-new",
"application-exit",
"appointment-new",
"call-start",
"call-stop",
"contact-new",
"document-new",
"document-open",
"document-open-recent",
"document-page-setup",
"document-print",
"document-print-preview",
"document-properties",
"document-revert",
"document-save",
"document-save-as",
"document-send",
"edit-clear",
"edit-copy",
"edit-cut",
"edit-delete",
"edit-find",
"edit-paste",
"edit-redo",
"edit-select-all",
"edit-undo",
"folder-new",
"format-indent-less",
"format-indent-more",
"format-justify-center",
"format-justify-fill",
"format-justify-left",
"format-justify-right",
"format-text-direction-ltr",
"format-text-direction-rtl",
"format-text-bold",
"format-text-italic",
"format-text-underline",
"format-text-strikethrough",
"go-down",
"go-home",
"go-next",
"go-previous",
"go-up",
"help-about",
"help-faq",
"insert-image",
"insert-link",
"insert-text",
"list-add",
"list-remove",
"mail-forward",
"mail-mark-important",
"mail-mark-read",
"mail-mark-unread",
"mail-message-new",
"mail-reply-all",
"mail-reply-sender",
"mail-send",
"media-eject",
"media-playback-pause",
"media-playback-start",
"media-playback-stop",
"media-record",
"media-seek-backward",
"media-seek-forward",
"media-skip-backward",
"media-skip-forward",
"object-rotate-left",
"object-rotate-right",
"process-stop",
"system-lock-screen",
"system-log-out",
"system-search",
"system-reboot",
"system-shutdown",
"tools-check-spelling",
"view-fullscreen",
"view-refresh",
"view-restore",
"window-close",
"window-new",
"zoom-fit-best",
"zoom-in",
"zoom-out",
"audio-card",
"audio-input-microphone",
"battery",
"camera-photo",
"camera-video",
"camera-web",
"computer",
"drive-harddisk",
"drive-optical",
"input-gaming",
"input-keyboard",
"input-mouse",
"input-tablet",
"media-flash",
"media-optical",
"media-tape",
"multimedia-player",
"network-wired",
"network-wireless",
"phone",
"printer",
"scanner",
"video-display",
"appointment-missed",
"appointment-soon",
"audio-volume-high",
"audio-volume-low",
"audio-volume-medium",
"audio-volume-muted",
"battery-caution",
"battery-low",
"dialog-error",
"dialog-information",
"dialog-password",
"dialog-question",
"dialog-warning",
"folder-drag-accept",
"folder-open",
"folder-visiting",
"image-loading",
"image-missing",
"mail-attachment",
"mail-unread",
"mail-read",
"mail-replied",
"media-playlist-repeat",
"media-playlist-shuffle",
"network-offline",
"printer-printing",
"security-high",
"security-low",
"software-update-available",
"software-update-urgent",
"sync-error",
"sync-synchronizing",
"user-available",
"user-offline",
"weather-clear",
"weather-clear-night",
"weather-few-clouds",
"weather-few-clouds-night",
"weather-fog",
"weather-showers",
"weather-snow",
"weather-storm"
);
static_assert(QIcon::ThemeIcon::NThemeIcons == QIcon::ThemeIcon(mapping.count()));
using ThemeIconIndex = std::underlying_type_t<QIcon::ThemeIcon>;
const auto index = static_cast<ThemeIconIndex>(icon);
Q_ASSERT(index < mapping.count());
return QLatin1StringView(mapping.viewAt(index));
Q_ASSERT(index < themeIconMapping.count());
return QLatin1StringView(themeIconMapping.viewAt(index));
}
/*!