зеркало из https://github.com/microsoft/clang-1.git
Initialize block's imported variable(s) in
block's synthesized constructor initalizer list. Fixes radar 8240371. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109698 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
e8a126ba9a
Коммит
20432ef377
|
@ -4309,7 +4309,41 @@ std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
|
|||
S += FieldName + "; // by ref\n";
|
||||
}
|
||||
// Finish writing the constructor.
|
||||
Constructor += ", int flags=0) {\n";
|
||||
Constructor += ", int flags=0)";
|
||||
// Initialize all "by copy" arguments.
|
||||
bool firsTime = true;
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
E = BlockByCopyDecls.end(); I != E; ++I) {
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
if (firsTime) {
|
||||
Constructor += " : ";
|
||||
firsTime = false;
|
||||
}
|
||||
else
|
||||
Constructor += ", ";
|
||||
if (isTopLevelBlockPointerType((*I)->getType()))
|
||||
Constructor += Name + "((struct __block_impl *)_" + Name + ")";
|
||||
else
|
||||
Constructor += Name + "(_" + Name + ")";
|
||||
}
|
||||
// Initialize all "by ref" arguments.
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
E = BlockByRefDecls.end(); I != E; ++I) {
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
if (firsTime) {
|
||||
Constructor += " : ";
|
||||
firsTime = false;
|
||||
}
|
||||
else
|
||||
Constructor += ", ";
|
||||
if (isTopLevelBlockPointerType((*I)->getType()))
|
||||
Constructor += Name + "((struct __block_impl *)_"
|
||||
+ Name + "->__forwarding)";
|
||||
else
|
||||
Constructor += Name + "(_" + Name + "->__forwarding)";
|
||||
}
|
||||
|
||||
Constructor += " {\n";
|
||||
if (GlobalVarDecl)
|
||||
Constructor += " impl.isa = &_NSConcreteGlobalBlock;\n";
|
||||
else
|
||||
|
@ -4317,29 +4351,6 @@ std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
|
|||
Constructor += " impl.Flags = flags;\n impl.FuncPtr = fp;\n";
|
||||
|
||||
Constructor += " Desc = desc;\n";
|
||||
|
||||
// Initialize all "by copy" arguments.
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
E = BlockByCopyDecls.end(); I != E; ++I) {
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
Constructor += " ";
|
||||
if (isTopLevelBlockPointerType((*I)->getType()))
|
||||
Constructor += Name + " = (struct __block_impl *)_";
|
||||
else
|
||||
Constructor += Name + " = _";
|
||||
Constructor += Name + ";\n";
|
||||
}
|
||||
// Initialize all "by ref" arguments.
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
E = BlockByRefDecls.end(); I != E; ++I) {
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
Constructor += " ";
|
||||
if (isTopLevelBlockPointerType((*I)->getType()))
|
||||
Constructor += Name + " = (struct __block_impl *)_";
|
||||
else
|
||||
Constructor += Name + " = _";
|
||||
Constructor += Name + "->__forwarding;\n";
|
||||
}
|
||||
} else {
|
||||
// Finish writing the constructor.
|
||||
Constructor += ", int flags=0) {\n";
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
|
||||
// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
|
||||
// rdar:// 8243071
|
||||
|
||||
void x(int y) {}
|
||||
void f() {
|
||||
const int bar = 3;
|
||||
int baz = 4;
|
||||
__block int bab = 4;
|
||||
__block const int bas = 5;
|
||||
void (^b)() = ^{
|
||||
x(bar);
|
||||
x(baz);
|
||||
x(bab);
|
||||
x(bas);
|
||||
b();
|
||||
};
|
||||
b();
|
||||
}
|
Загрузка…
Ссылка в новой задаче