Issue |
99877
|
Summary |
Crash when evaluating folds involving lambdas and variadic templates
|
Labels |
clang:frontend
|
Assignees |
ilya-biryukov
|
Reporter |
ilya-biryukov
|
On this code:
```cpp
struct tuple {
int x[3];
};
template <class F>
void apply(F f, tuple v) {
return f(v.x[0], v.x[1], v.x[2]);
}
void Cartesian(auto x, auto y) {
apply([&](auto... xs) {
(apply([xs](auto... ys) {
(ys + ...);
}, y), ...);
}, x);
}
int main() {
auto x = tuple({1, 2, 3});
auto y = tuple({4, 5, 6});
Cartesian(x, y);
}
```
Clang will crash with a following assertion error:
```
clang++: /root/llvm-project/clang/lib/Sema/TreeTransform.h:15248: clang::ExprResult clang::TreeTransform<Derived>::TransformCXXFoldExpr(clang::CXXFoldExpr*) [with Derived = {anonymous}::TemplateInstantiator; clang::ExprResult = clang::ActionResult<clang::Expr*>]: Assertion `!Unexpanded.empty() && "Pack expansion without parameter packs?"' failed.
```
The problem arises because when substituting into inner lambdas, Clang will incorrectly loose the `ContainsUnexpandedPack` dependency on a lambda _expression_. In turn, this confuses the `CXXFoldExpr` that relies in this flag to distinguish left and right folds, which will pass the `nullptr` expr to `CollectUnexpandedParameterPacks` and cause it to not find any packs when transforming the fold _expression_, leading to an asssertion.
I have already been working on a fix for a few days and more sophisticated tests, so assigning to myself right away.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs