[all-commits] [llvm/llvm-project] 22b449: [ADT] Fix alignment check in unique_function const...
Dmitry Yanovsky via All-commits
all-commits at lists.llvm.org
Mon Aug 19 11:57:08 PDT 2024
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 22b4496e86c32127e997f3e7385ef64d2d80cc4b
https://github.com/llvm/llvm-project/commit/22b4496e86c32127e997f3e7385ef64d2d80cc4b
Author: Dmitry Yanovsky <kerambyte at gmail.com>
Date: 2024-08-19 (Mon, 19 Aug 2024)
Changed paths:
M llvm/include/llvm/ADT/FunctionExtras.h
M llvm/unittests/ADT/FunctionExtrasTest.cpp
Log Message:
-----------
[ADT] Fix alignment check in unique_function constructor (#99403)
Right now the check fails for any state-capturing lambda since this
expression - `alignof(decltype(StorageUnion.InlineStorage))` - returns 1
for the alignment value and not 4/8 as expected
([MSVC|Clang|GCC](https://godbolt.org/z/eTEdq4xjM)). So this check fails
for pretty much any state-capturing callable we try to store into a
`unique_function` and we take the out-of-line storage path:
\llvm-project\llvm\include\llvm\ADT\FunctionExtras.h,
`UniqueFunctionBase` constructor (line ~266):
```
if (sizeof(CallableT) > InlineStorageSize ||
alignof(CallableT) > alignof(decltype(StorageUnion.InlineStorage))) {
// ...
}
```
The fix is simply to use an explicit const variable to store the
alignment value.
There is no easy way to unit-test the fix since inline storage is
considered to be an implementation detail so we shouldn't assume how the
lambda ends up being stored.
To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications
More information about the All-commits
mailing list