[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