andreasfertig wrote: Hello all,
I did more investigation and found another shortcoming. In some cases, my initial implementation picked the wrong `this`- type, for example, https://github.com/andreasfertig/llvm-project/blob/9c60fec6881cca7e7fed9dca5cf24a0bd1924eaa/clang/test/SemaCXX/coroutine-promise-ctor-lambda.cpp#L45. I pushed a new branch (https://github.com/andreasfertig/llvm-project/tree/fixGH84064take2), which also fixes this behavior and requires fewer changes. Regarding the crash, that was improper testing on my side. All tests let Clang crash, even the tests I checked in as part of the PR. The difference is that my tests used only `static_assert` to verify that the lambda's size did not increase, while the `async_simple::Generator` example _executes_ the code. This step leads to code generation, the `static_assert`, I assume, is handled only on the constexpr evaluator. This is where I'm stuck. The call stack for all cases is: ``` #5 0x0000000105534f38 clang::CodeGen::CodeGenFunction::EmitCall(clang::CodeGen::CGFunctionInfo const&, clang::CodeGen::CGCallee const&, clang::CodeGen::ReturnValueSlot, clang::CodeGen::CallArgList const&, llvm::CallBase**, bool, clang::SourceLocation) (build/bin/clang-19+0x10262cf38) #6 0x00000001055e10d8 clang::CodeGen::CodeGenFunction::EmitCall(clang::QualType, clang::CodeGen::CGCallee const&, clang::CallExpr const*, clang::CodeGen::ReturnValueSlot, llvm::Value*) (build/bin/clang-19+0x1026d90d8) #7 0x00000001055e01b4 clang::CodeGen::CodeGenFunction::EmitCallExpr(clang::CallExpr const*, clang::CodeGen::ReturnValueSlot) (build/bin/clang-19+0x1026d81b4) #8 0x000000010561e5a8 (anonymous namespace)::ScalarExprEmitter::VisitCallExpr(clang::CallExpr const*) (build/bin/clang-19+0x1027165a8) #9 0x000000010560edec clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) (build/bin/clang-19+0x102706dec) #10 0x000000010554e22c clang::CodeGen::CodeGenFunction::EmitCoroutineBody(clang::CoroutineBodyStmt const&) (build/bin/clang-19+0x10264622c) ``` The crash is within `CodeGenFunction::EmitCall` at https://github.com/llvm/llvm-project/blob/8bb9443333e0117ab61feecce9de339b11b924fc/clang/lib/CodeGen/CGCall.cpp#L5298 `I->getKnownRValue().getScalarVal()` is `nullptr`, which leads to the crash later when `V` is deferenced. I don't understand why `getKnownRValue` is empty. It looks to me like I had to mark `this` to be not optimized away. However, I could not see any coding doing this for the non-lambda case. Any thoughts? https://github.com/llvm/llvm-project/pull/84193 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits