From 7a850fc00c728d48ad7483bc260bd255d71af7ed Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 15 Dec 2022 17:45:56 +0100 Subject: [PATCH] QT_INLINE_SINCE: never inline for static Qt builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Static Qt builds are not covered by BC guarantees, but since all 'libraries' are linked into a single executable, we face in all users of the library the same ODR violation that we faced within the implementation DLL: we can't define the same symbol as inline in some TUs and out-of-line in others. In the past, we decided to always inline in static builds, but that breaks users which, by Hyrum's Law, have come to depend on the non-existent BC guarantees for static Qt builds. By switching to never inline¹ in static builds, we restore BC for such users. The performance issues should be minimal, since LTO will anyway inline whatever it wants, independent on how it was declared. ¹ except when the deprecation point has passed over the Qt version the API was inlined (-disable-deprecated-up-to configure switch). [ChangeLog][QtCore] Restored binary compatibility for static Qt builds broken by the QT_INLINE_SINCE mechanism. Qt still does not guarantee BC for static build configurations otherwise. Fixes: QTBUG-109449 Change-Id: Ie3fa62621b74dc5e9dac301b9882c0e3c3999eaf Reviewed-by: Thiago Macieira Reviewed-by: Qt CI Bot (cherry picked from commit 8602a224b6ade5680329270d8d573b786a7a81a1) Reviewed-by: Qt Cherry-pick Bot --- cmake/modulecppexports.h.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/modulecppexports.h.in b/cmake/modulecppexports.h.in index 725d9d79f1f..a7a349084ec 100644 --- a/cmake/modulecppexports.h.in +++ b/cmake/modulecppexports.h.in @@ -16,8 +16,9 @@ # define Q_@module_define_infix@_EXPORT #endif -#if !defined(QT_BUILD_@module_define_infix@_LIB) || defined(QT_STATIC) +#if !defined(QT_BUILD_@module_define_infix@_LIB) && !defined(QT_STATIC) /* outside library → inline decl + defi */ +/* static builds treat everything as part of the library, so they never inline */ # define QT_@module_define_infix@_INLINE_SINCE(major, minor) inline # define QT_@module_define_infix@_INLINE_IMPL_SINCE(major, minor) 1 #elif defined(QT_@module_define_infix@_BUILD_REMOVED_API)