[PATCH] D58164: Block+lambda: allow reference capture
Akira Hatanaka via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 14 21:31:33 PST 2019
ahatanak accepted this revision.
ahatanak added a comment.
This revision is now accepted and ready to land.
Sorry, I was misunderstanding the problem.
I was trying to understand why the crash goes away if I change the generic lambda to a non-generic one. What I found was that, when the lambda is generic, `captureInBlock` is passed a `CaptureType` that isn't an lvalue reference type and therefore performs copy initialization and sets the copy expression of the Capture to a non-null expression. This happens because `isVariableAlreadyCapturedInScopeInfo` doesn't assign the correct type (which should be an `LValueReferenceType`) to `CaptureType` when the variable is captured by reference.
I think this can be fixed if we check whether `CaptureType` is a reference capture in `isVariableAlreadyCapturedInScopeInfo` and, if it is, turn it into an lvalue reference type.
================
Comment at: test/CodeGenCXX/lambda-capturing-block.cpp:1
+// RUN: %clang_cc1 -triple=x86_64-apple-darwin -S -emit-llvm -std=c++17 -fblocks -fcxx-exceptions -o - %s | FileCheck %s
+
----------------
I think you can simplify the test case a bit more:
- remove -fcxx-exceptions.
- remove 'extern "C"'.
- remove the derp's move constructor and destructor.
- remove the try/catch and just call 'c.cancel' in the function.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D58164/new/
https://reviews.llvm.org/D58164
More information about the cfe-commits
mailing list