[qt/qt/qtbase]: Summary of bulk changes made
KDE Git Services - Bulk Change <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git repository change summary for qt/qt/qtbase Pushed by mirror-service into branch 'dev'. Changed from 50cc08f278c6961d00b5b8bae408d4ccc2fbca4d to 7eeb08d217ca941260b759be388f6bbee423fbc7 Acknowledgement was received that this change introduces only existing code that has been pushed to another public open source repository. This change contains the following new commits: Git commit 7f10a899198034157b43181e946b10090283b081 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Bind texture and sampler arrays as one descriptor range A QRhiShaderResourceBinding with an array of textures/samplers (count > 1) was translated into count descriptor ranges of one descriptor each, and for samplers into count separate root parameters. D3D12 does not accept that as binding a shader-declared resource array; pipeline creation fails with Root Signature doesn't match Pixel Shader: Shader sampler descriptor range (BaseShaderRegister=0, NumDescriptors=8, RegisterSpace=0) is not fully bound in root signature and likewise for the SRV range. This only happens with shaders that have SM 6.0 (or 5.1) bytecode. SM 5.0 DXBC has no descriptor ranges: there an array of textures is declared as t0, t1, ... individually, and a series of one-descriptor ranges covering the same registers matches that just fine. With DXIL the array becomes a single shader-declared range of count descriptors, and then the root signature has to cover it with one range as well. Since practically all shaders shipped with Qt are built with --hlsl 50, this went unnoticed: the existing tst_qrhi test for an array of combined image samplers passes with the D3D12 backend as-is, and only starts failing once its fragment shader is rebuilt for SM 6.0. Visit textures and samplers per binding instead of per array element, and emit a single range with NumDescriptors == count. The SRV descriptors already get copied into a consecutive block of the shader-visible heap, so only the range construction changes there. The per-sampler shader-visible descriptors are scattered around the sampler heap, so an array of samplers now gets a dedicated run of consecutive descriptors from QD3D12SamplerManager, cached by the list of sampler descriptions (not by QRhiSampler objects, so unrelated srbs with the same filtering and addressing modes share one run). Bindings with a single texture/sampler, which is everything in practice today, end up with the same root signature and the same descriptors as before. Add a tst_qrhi test that renders with an array of 8 sampled textures, each filled with a single color and sampled into a column of its own, so that the result also shows whether the array ended up in the right order. Two different samplers alternate in the array, to get a run of non-identical sampler descriptors. The shaders are built for SM 6.0 in addition to 5.0, which is what makes the test exercise the descriptor range path with D3D12. Pick-to: 6.12 6.11 6.8 Change-Id: I37b38bb35fd2953cf52166255ac931a51cef819e Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/7f10a899198034157b43181e946b10090283b081 Git commit 8dd64c5df599b56939602bad94f7ebef7652fe06 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Route debug layer warnings to qDebug, when possible Try to behave like we do with Vulkan. There is a pre-existing minor issue: this now makes some debug layer messages show up with D3D12 for two test cases in tst_qrhi. Previously these were only visible on the Windows debug output. Not handling those here. Pick-to: 6.12 Change-Id: Ibd4ddaec3cdb7f5df4f5a49a38047f568b60e8c4 Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/8dd64c5df599b56939602bad94f7ebef7652fe06 Git commit c13fd99f923c90c28e8cea23719bce119dd13fab by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Discard resolve destination subresources when needed The subresources of a placed resource must be initialized with a Discard, Clear, or Copy operation before they can be used for anything else. ResolveSubresource is not one of those operations, so resolving into a texture that was never rendered into makes the debug layer complain. Fix it by discarding upfront, but only the destination subresources that are about to be overwritten by the resolve, and only once for each of them. This gets rid of the debug layer messages from the renderToTextureArrayMultiView test case in tst_qrhi. Pick-to: 6.12 Change-Id: I6add9447ff946257293e97864972b4f5be49e73f Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/c13fd99f923c90c28e8cea23719bce119dd13fab Git commit b96197efff3b5ac03d554df92c6fa444e64ef711 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi autotest: Do not read back an uninitialized cubemap face renderToTextureCubemapFace reads back not only the face it renders into, but also another one, in order to verify that the layer parameter is not ignored. That face was never written to, and so the results of reading it back are undefined. With D3D12 it also makes the debug layer complain, because the subresources of a placed resource must be initialized with a Discard, Clear, or Copy operation before they can be used for anything else. Upload a known content to that face instead. This is a Copy, so it initializes the subresource, and it makes the readback result deterministic, which allows checking the uploaded color as well. Pick-to: 6.12 6.11 6.8 Change-Id: Ia0b5e21a3d57e3c598903242a77acb92736f2b70 Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/b96197efff3b5ac03d554df92c6fa444e64ef711 Git commit a7f4d5bd760974b0591b35b9100da98897846656 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Fix descriptor aliasing in the CPU descriptor pool In QD3D12CpuDescriptorPool::allocate() only marks the first descriptor as used. This is incorrect when count > 1 since a later allocate() would then hand out entries still marked as free that are in fact in use. Then, allocate() hands out descriptors in two ways: while the last heap has enough room at the end, it takes [head..head + count) via QD3D12DescriptorHeap::get(), which advances head and never consults the bitmap; when it does not, it scans the bitmaps of all heaps for a free run instead and returns that via QD3D12DescriptorHeap::at(), which leaves head untouched. The get() based path is only safe if heap.head is advanced when hitting the other (at()-based) path. This is currently missing, so add it. None of these are a problem in practice atm, because every call site passes count == 1, which hides the issues since a successful bump test already implies head < capacity. Fix it nonetheless. Pick-to: 6.12 Change-Id: Iedb7b5ab83b14545d518e58969b3ca2ba5576f90 Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/a7f4d5bd760974b0591b35b9100da98897846656 Git commit b6b81f00cd396c98f0f3492461a88559c27fcf46 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Cache the srb-to-binding translation setShaderResources() ran QD3D12ShaderResourceVisitor over all bindings for all stages on every call. With typical QRhi-based renderers, such as Qt Quick, that in many cases mean once per draw call because consecutive draws use different srbs, and so srbChanged is very often true. Do this only once. The result of the binding visitors now lives in QD3D12ShaderResourceBindings::bindingCache and is rebuilt only when the srb or the pipeline it is used with changes. The callbacks that collect it move from QD3D12CommandBuffer to the srb and are renamed to cache*, so QD3D12CommandBuffer::VisitorData is gone altogether. What is cached must not depend on the frame slot or on the dynamic offsets, so the uniform buffer entries keep the QRhiBuffer and the binding number, and both the per-frame-slot resource and the dynamic offset are resolved when binding. Caching means a resource recreated (as in, the renderer calling QRhiBuffer::create() again after setting a different size, for example) without the srb itself being touched has to invalidate it. Follow the D3D11 backend and track the id and generation of each bound resource, checked in the loop that walks the bindings for the barriers anyway. QD3D12Texture already had a generation that was never read; QD3D12Buffer and QD3D12Sampler had none, so add and bump those. lastUsedGraphicsPipeline and lastUsedComputePipeline now clear each other, otherwise a graphics, compute, same-graphics sequence on one srb reports no pipeline change on the third bind and would get the cache built for the compute pipeline. And a new lastUsedPipelineGeneration catches a pipeline recreated in place. Also, copy the SRVs into the shader-visible heap with a single CopyDescriptors instead of one CopyDescriptorsSimple per descriptor. Results with a heavy qmlbench test scene on one particular machine: changing_over_isolated_with_clip_rotated: OpenGL 1176 Vulkan 1980 D3D11 1543 D3D12 before 1867 D3D12 after 2193 With QCanvasPainter's qcpainterbench, default window size, item count set to 64: OpenGL 54 Vulkan 78 D3D11 58 D3D12 before 67 D3D12 after 78 Pick-to: 6.12 Change-Id: I91c88b1e7d7cced5777b1306b5adfd7aa51a9bb9 Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/b6b81f00cd396c98f0f3492461a88559c27fcf46 Git commit d3e20737be0d3d2e6a287add51dc2a6d491a2dc9 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Batch the transition barriers in setShaderResources QD3D12ResourceBarrierGenerator exists to collect transition barriers and submit them as one ResourceBarrier() call, but the call site defeated that: the enqueue sat inside the loop over the bindings, so N textures needing a transition produced N calls with one barrier each instead of one call with N. Barrier batching is worth real GPU time, on AMD and Intel in particular. beginPass() already does it the right way. Move the enqueue out of the loop. The reason for not doing this before were probably the UAV barriers issues from within the loop, and attempting to keep a strict ordering for all the barriers. But that is not a problem in practice. Pick-to: 6.12 Change-Id: Ia2ae09c89d9be9bf5676b214c525b161b16f5b7b Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/d3e20737be0d3d2e6a287add51dc2a6d491a2dc9 Git commit 521a26d46140f43ffda28c21d65c2b23639cb587 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Use one MSAA buffer per frame slot, not per back buffer Unlike the swapchain's own buffers, an MSAA buffer is written and then resolved into the back buffer within a single frame, and its contents never have to survive into the next one. A swapchain render target is always cleared in beginPass() as well. Thus having FRAMES_IN_FLIGHT (2) buffers (and render target views) is enough, there is no need to have BUFFER_COUNT (3). Saves a third of what is typically the largest allocation in the process. For a 4K window with 4x MSAA that is around 130MB. Pick-to: 6.12 Change-Id: Ic056eeaae6adf8371f482d8284956d29dca7ae5c Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/521a26d46140f43ffda28c21d65c2b23639cb587 Git commit 4a0aa935ae8463847d4b5aa98d61576f68baac49 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Size the per-frame staging area to what is used QRhi::create() committed 16MB of upload heap per frame slot, so 32MB per QRhi, allocated up front and never given back. Most applications do not need this amount of staging area persistently: in the steady state a typical Qt Quick scene stages very little, since what does get staged in bulk tends to be textures uploaded once during startup or when changing views. The fallback for a request that does not fit is already there (the dedicated, deferred-released staging area for that one upload). So we for the "small" staging area we can start e.g. at 512KB per slot and grow only once an application turns out to need more, with 16MB kept as the upper bound. Growing is reactive: record what each frame slot is asked for, then resize in beginFrame(), which is where the area is rewound anyway. A frame that outgrows the common, "small" area pays for a few dedicated staging areas once, and the next frame on that slot has room. Shrink as well when demand stays low for a number of (currently 60) frames, halving down to the starting size, so that a one-off burst of texture uploads does not keep the memory for the lifetime of the QRhi. As an example, with this patch in place the lights example of Qt Quick 3D's memory usage goes ca. 118 MB -> 95 MB, using crude Task Manager based measurement: D3D11 56 OpenGL 97 Vulkan 144 D3D12 before 118 D3D12 after 95 Pick-to: 6.12 Change-Id: I63410eebc245ca545d37740430ebe2373b3a27c3 Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/4a0aa935ae8463847d4b5aa98d61576f68baac49 Git commit e1ff0baedb3ef1283f5070659d2b6c69470806f4 by Laszlo Agocs on 30/07/2026 at 18:19.. rhi: d3d12: Build the mipmap generator pipelines on first use QRhi::create() built the root signature and compute pipeline for both the 2D and the 3D mipmap generator, always. That is two serialized root signatures and two driver-side compute shader compiles per QRhi, even when mipmaps are never built by an application. Do it lazily instead. Pick-to: 6.12 Change-Id: Id366da22d10a84a53672f29a905c77dcc944153f Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/e1ff0baedb3ef1283f5070659d2b6c69470806f4 Git commit 8909e6458566e6a5407f501d0f91968b785af7d8 by Laszlo Agocs on 30/07/2026 at 18:19.. QtOpenGL: add more trusted-content notes QOpenGLShader and QOpenGLShaderProgram already carry this. Add a few more for completeness. Task-number: QTBUG-148531 Pick-to: 6.12 6.11 6.8 Change-Id: I34660aa7748bc67692c8243d4ed3b2da4917525a Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/8909e6458566e6a5407f501d0f91968b785af7d8 Git commit 73d38519db4e0bb8815b44ce59ead3e35de67858 by Laszlo Agocs on 30/07/2026 at 18:19.. Gracefully handle broken VK_EXT_debug_utils Fixes: QTBUG-148216 Pick-to: 6.12 6.11 6.8 Change-Id: I16180bb5b9a5bda9eb6b99167ecd61b5410ce07c Reviewed-by: Andy Nichols <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/73d38519db4e0bb8815b44ce59ead3e35de67858 Git commit 64d9407831aaf6004084ce796ef511b8d8c6333b by Marc Mutz (on behalf of Thiago Macieira) on 30/07/2026 at 21:22.. QStringBuilder: remove ASCII cast warning for char16_t There is no ASCII cast here. Amends commit 641e010cc7b52b6c3ac213e151781ffcbdd89145, which introduced char16_t support. I'm guessing this was copy & paste mistake. qqmltcpropertyutils_p.h:39:47: required from here 38 | return (elementType->isReferenceType() ? u"QQmlListProperty<" : u"QList<") | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 39 | + elementType->internalName() + u'>'; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~ qstringbuilder.h:402:37: warning: ‘static void QConcatenable<const char16_t*>::appendTo(const char16_t*, QChar*&)’ is deprecated: Use fromUtf8, QStringLiteral, or QLatin1StringView [-Wdeprecated-declarations] qstringbuilder.h:351:43: note: declared here 351 | QT_ASCII_CAST_WARN static inline void appendTo(const char16_t *a, QChar *&out) | ^~~~~~~~ Pick-to: 6.12 6.11 6.8 Change-Id: Iddfa44f640511c61f636fffdaa7418b53f40169e Reviewed-by: Marc Mutz <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/64d9407831aaf6004084ce796ef511b8d8c6333b Git commit dc93a3b1c6654bf29c53ee448c3c1ffe6a859958 by Marc Mutz on 30/07/2026 at 21:22.. QDecompressHelper: mark isSupportedEncoding() noexcept It conceptually should be, and the implementation actually calls only noexcept functions, so it's safe to commit to the no-fail label. Amends 07b008425acb1f550c3e6e96e2bd6033fe86976a (6.0), the addition of the class. Pick-to: 6.12 6.11 6.8 Change-Id: I648b9cb1de4ccbc315f5f2ece8985632f58b74f5 Reviewed-by: Thiago Macieira <[email protected]> Reviewed-by: Dennis Oberst <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/dc93a3b1c6654bf29c53ee448c3c1ffe6a859958 Git commit 55df5ccd997446760364f55aa041efc7c80d6fdd by Marc Mutz on 30/07/2026 at 21:22.. QBasicAtomic: fix UB (signed overflow) in some operators The underlying atomic operations are fine (required by the standard, cf. Note in ¹), but our adjustments of the return value were not, and could overflow. Fix by using unsigned arithmetic to do the calculation as required by the standard: ¹ https://eel.is/c++draft/atomics.types.generic#atomics.types.int-8 Found by ubsan complaining about signed overflow in tst_qatomicinteger_<signed int> tests. Amends 19c70982517e76d89bb3da931e1390a6386603da (5.3). [ChangeLog][QtCore][QAtomicInt/QAtomicInteger] Fixed signed arithmetic in prefix increment and decrement and in += and -= to be in two's complement, matching std::atomic's behavior, rather than overflowing (causing undefined behavior). Pick-to: 6.12 6.11 6.8 6.5 5.15 Change-Id: Ic1aa41a803bca9a2d873d7ada8343d0ca01e3fe4 Reviewed-by: Giuseppe D'Angelo <[email protected]> Reviewed-by: Thiago Macieira <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/55df5ccd997446760364f55aa041efc7c80d6fdd Git commit 3efb5cbfa27b79ce2411b5860ab6ee7bce633390 by Alexandru Croitor on 30/07/2026 at 21:22.. CMake: Pass QT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH to EP examples External project examples should inherit the QT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH variable if it is set by the caller. Pick-to: 6.12 Task-number: QTBUG-90820 Task-number: QTBUG-96232 Change-Id: Ie1a9ebb2b5ed57a2449979a3fd5446a0361bf719 Reviewed-by: Orkun Tokdemir <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/3efb5cbfa27b79ce2411b5860ab6ee7bce633390 Git commit 48233d8ccd3c80dfdbe18442bf291fb4cb44862d by Alexandru Croitor on 30/07/2026 at 21:22.. CMake: Pass vcpkg related vars to external project examples External project examples need to be able to find the same host and target tools / libraries as the main build when vcpkg is used. Make sure to pass those along when set. Also make sure to pass -DVCPKG_MANIFEST_INSTALL=OFF unless opted out, to ensure we don't download, build and install packages into each example build dir when a vcpkg.json manifest file is present. Pick-to: 6.12 Task-number: QTBUG-90820 Task-number: QTBUG-96232 Change-Id: I1d6f3b3d1226a27343c2526ac40d6824ae1c792a Reviewed-by: Orkun Tokdemir <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/48233d8ccd3c80dfdbe18442bf291fb4cb44862d Git commit fccf972ac5b4d50aa98275c89dd27b3372a15f41 by Alexandru Croitor on 30/07/2026 at 21:22.. coin: Enable vcpkg usage for cross-compiled standalone examples Set vcpkg-related variables when cross-compiling standalone examples, and not only the standalone tests and the main build. This ensures examples as external projects can find the same vcpkg third party tools and libraries as the main build. Amends 49c3cda61cfd486aa67d69b1e3f9d26bb6a06619 Pick-to: 6.12 Task-number: QTBUG-90820 Task-number: QTBUG-96232 Change-Id: I65f562d1417090656c2b3827d689b62d46aa9180 Reviewed-by: Orkun Tokdemir <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/fccf972ac5b4d50aa98275c89dd27b3372a15f41 Git commit 9b98839e826d52d17eebcda0bce73200f9f6dfc0 by Alexandru Croitor on 30/07/2026 at 21:22.. coin: Set QEMU_LD_PREFIX for examples built as external projects In a cross-built Qt that has QT_FORCE_BUILD_TOOLS_ON, examples built as 'external projects' find the /target platform/ tools. This caused issues when trying to invoke the target tool during the example build, leading to an error like: qemu-arm: Could not open '/lib/ld-linux-armhf.so.3': No such file or directory To be specific, it happens for the qttools arrowpad example in the CI for the yocto platform configurations. The find_package(Qt6 COMPONENTS LinguistTools) call finds the Qt6LinguistToolsConfig.cmake file in the target sysroot, which refers to the target 'lupdate'. This is called during the example build, and fails. When building cmake or qmake tests, this doesn't happen because we set the QEMU_LD_PREFIX env var to ensure the target tools can run on the host. Do the same for the standalone example builds. Pick-to: 6.12 Task-number: QTBUG-90820 Task-number: QTBUG-96232 Change-Id: Id2a577d0f29d78371099bafd4971db9590fd720a Reviewed-by: Orkun Tokdemir <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/9b98839e826d52d17eebcda0bce73200f9f6dfc0 Git commit 71ccc59fb8a24de085d2284a4ae094c9b43efb06 by Marc Mutz on 30/07/2026 at 22:39.. tst_QLogging: fix -Wunused-result in race_helper ... using the std::ignore trick. Also treat poll(), even though GCC doesn't warn about it, to keep indentation consistent, and to record intent. Amends 6e37cd4176368bee838161f5353038027bcdbe50 (picked to 6.5). Pick-to: 6.12 6.11 6.8 Change-Id: Ia4ba0967eece28ed7c35fe15b04c8b7d938ac029 Reviewed-by: Thiago Macieira <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/71ccc59fb8a24de085d2284a4ae094c9b43efb06 Git commit c3231cd78597207902d517b6032e5c4ac27100d0 by Marc Mutz on 30/07/2026 at 22:39.. tst_QKeyCombination: suppress deprecation warning emitted by API under test Amends 1f77e8566f71d98f4bc6bbf5092594e67a32f268 (picked to 6.2). Pick-to: 6.12 6.11 6.8 Change-Id: I2b396154057985ff9cca71192f0d67e62bd83451 Reviewed-by: Thiago Macieira <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/c3231cd78597207902d517b6032e5c4ac27100d0 Git commit 1c285d07760b5b0b6f8c7f8dde47fd4b922a94e7 by Marc Mutz on 30/07/2026 at 22:39.. QString: remove unused qthreadstorage.h The last user of QThreadStorage in this TU was moved to qcollator.cpp in a9d8794cf0be617d9eedbf9bb0d6d5401735d6f2 (6.3). Pick-to: 6.12 6.11 6.8 Change-Id: I951b024c6a8e069c1cb9eb12c0e71094bdedcd40 Reviewed-by: Thiago Macieira <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/1c285d07760b5b0b6f8c7f8dde47fd4b922a94e7 Git commit 5919760e3283bb609d9d9f534c02344ae264839e by Marc Mutz on 30/07/2026 at 22:39.. tst_QDateTime: extend the tests for msec over/underflow to the argument The old tests set the extreme values on the QDateTime (LHS), and then added or subtracted one (1) (addMSecs() argument, RHS). What was not tested was to start with the ±1 on LHS and then add or subtract the extreme values. Add those tests. Lucky for us, they pass (incl. in ubsan builds). Amends 2a6f2fe9ef9a5d0755443ba94183d97b2fac1a28 (6.0). Pick-to: 6.12 6.11 6.8 6.5 Change-Id: Ie3076b845944a6890fa7423f03d850681beeb0a0 Reviewed-by: Thiago Macieira <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/5919760e3283bb609d9d9f534c02344ae264839e Git commit 19810242a1661191a577ee599747e374f89faa91 by Marc Mutz on 30/07/2026 at 22:39.. tst_QStorageInfo: fix GCC -Wformat-truncation GCC 15 (in ubsan/asan mode) warned: In function ‘int vsnprintf(char*, size_t, const char*, __va_list_tag*)’, inlined from ‘int qInfoPrinter(const char*, ...)’ at tst_qstorageinfo.cpp:78:33: /usr/include/x86_64-linux-gnu/bits/stdio2.h:80:36: warning: null format string [-Wformat-truncation=] 80 | return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, | ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 81 | __bos (__s), __fmt, __ap); | ~~~~~~~~~~~~~~~~~~~~~~~~~ But all callers (through the function pointer in printVolumes()) pass non-nullptr string literals, so it's a False Positive. Claude confirms it's a known problem of the GCC warning, but its fix (__attribute__((format))) didn't work, so I tried Q_PRESUME, and that fixed it. Amends a26435d65ceac5d714d5cc7d5af2326e162d7a41 (5.7). Picking to all active non-ESM branches, knowing that in 6.8, we'll need to use Q_ASSUME (Q_PRESUME is \since 6.11). Pick-to: 6.12 6.11 6.8 Change-Id: Ib91b26d2f75c7d3618e14c8a222e3a4d15c08c6c Reviewed-by: Thiago Macieira <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/19810242a1661191a577ee599747e374f89faa91 Git commit 7eeb08d217ca941260b759be388f6bbee423fbc7 by Marc Mutz on 30/07/2026 at 22:39.. QOCICols: don't pattern-init 64KiB of stack memory Another performance regression caused by 9ff1e6d80bbd5b44b9ec4c0a837d9a4c962698e4. Found by the function being rejected while trying to build qtbase with -Wframe-larger-than=20KiB. Pick-to: 6.12 6.11 6.8 Change-Id: I26d1e85db8d6eaf58d29b2e05da8cad90a195ad3 Reviewed-by: Giuseppe D'Angelo <[email protected]> https://invent.kde.org/qt/qt/qtbase/-/commit/7eeb08d217ca941260b759be388f6bbee423fbc7