forked from OSchip/llvm-project
Compute 'this' correctly for block in lambda.
Using CurFuncDecl is both correct and simple compared to crawling the DeclContexts of the block. Fixes <rdar://problem/14415072>. llvm-svn: 186210
This commit is contained in:
parent
e07b7a9f02
commit
c6036aa831
|
@ -355,14 +355,9 @@ static void computeBlockInfo(CodeGenModule &CGM, CodeGenFunction *CGF,
|
|||
|
||||
// First, 'this'.
|
||||
if (block->capturesCXXThis()) {
|
||||
const DeclContext *DC = block->getDeclContext();
|
||||
for (; isa<BlockDecl>(DC); DC = cast<BlockDecl>(DC)->getDeclContext())
|
||||
;
|
||||
QualType thisType;
|
||||
if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC))
|
||||
thisType = C.getPointerType(C.getRecordType(RD));
|
||||
else
|
||||
thisType = cast<CXXMethodDecl>(DC)->getThisType(C);
|
||||
assert(CGF && CGF->CurFuncDecl && isa<CXXMethodDecl>(CGF->CurFuncDecl) &&
|
||||
"Can't capture 'this' outside a method");
|
||||
QualType thisType = cast<CXXMethodDecl>(CGF->CurFuncDecl)->getThisType(C);
|
||||
|
||||
llvm::Type *llvmType = CGM.getTypes().ConvertType(thisType);
|
||||
std::pair<CharUnits,CharUnits> tinfo
|
||||
|
|
|
@ -60,6 +60,12 @@ void take_block(void (^block)()) { block(); }
|
|||
}
|
||||
@end
|
||||
|
||||
// Check lines for BlockInLambda test below
|
||||
// ARC: define internal i32 @___ZZN13BlockInLambda1X1fEvENKUlvE_clEv_block_invoke
|
||||
// ARC: [[Y:%.*]] = getelementptr inbounds %"struct.BlockInLambda::X"* {{.*}}, i32 0, i32 1
|
||||
// ARC-NEXT: [[YVAL:%.*]] = load i32* [[Y]], align 4
|
||||
// ARC-NEXT: ret i32 [[YVAL]]
|
||||
|
||||
typedef int (^fptr)();
|
||||
template<typename T> struct StaticMembers {
|
||||
static fptr f;
|
||||
|
@ -69,6 +75,18 @@ fptr StaticMembers<T>::f = [] { auto f = []{return 5;}; return fptr(f); }();
|
|||
template fptr StaticMembers<float>::f;
|
||||
// ARC: define linkonce_odr i32 ()* @_ZZNK13StaticMembersIfE1fMUlvE_clEvENKUlvE_cvU13block_pointerFivEEv
|
||||
|
||||
namespace BlockInLambda {
|
||||
struct X {
|
||||
int x,y;
|
||||
void f() {
|
||||
[this]{return ^{return y;}();}();
|
||||
};
|
||||
};
|
||||
void g(X& x) {
|
||||
x.f();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// ARC: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
// MRC: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
|
|
Loading…
Reference in New Issue