Patch to rewrite blocks into unique api names.
Fixes radar 7630551 llvm-svn: 95796
This commit is contained in:
parent
97c5902e78
commit
c3bdefa08d
|
@ -4158,16 +4158,23 @@ void RewriteObjC::InsertBlockLiteralsWithinFunction(FunctionDecl *FD) {
|
|||
SynthesizeBlockLiterals(FunLocStart, FuncName);
|
||||
}
|
||||
|
||||
static void BuildUniqueMethodName(std::string &Name,
|
||||
ObjCMethodDecl *MD) {
|
||||
ObjCInterfaceDecl *IFace = MD->getClassInterface();
|
||||
Name = IFace->getNameAsCString();
|
||||
Name += "__" + MD->getSelector().getAsString();
|
||||
// Convert colons to underscores.
|
||||
std::string::size_type loc = 0;
|
||||
while ((loc = Name.find(":", loc)) != std::string::npos)
|
||||
Name.replace(loc, 1, "_");
|
||||
}
|
||||
|
||||
void RewriteObjC::InsertBlockLiteralsWithinMethod(ObjCMethodDecl *MD) {
|
||||
//fprintf(stderr,"In InsertBlockLiteralsWitinMethod\n");
|
||||
//SourceLocation FunLocStart = MD->getLocStart();
|
||||
SourceLocation FunLocStart = MD->getLocStart();
|
||||
std::string FuncName = MD->getSelector().getAsString();
|
||||
// Convert colons to underscores.
|
||||
std::string::size_type loc = 0;
|
||||
while ((loc = FuncName.find(":", loc)) != std::string::npos)
|
||||
FuncName.replace(loc, 1, "_");
|
||||
|
||||
std::string FuncName;
|
||||
BuildUniqueMethodName(FuncName, MD);
|
||||
SynthesizeBlockLiterals(FunLocStart, FuncName.c_str());
|
||||
}
|
||||
|
||||
|
@ -4779,13 +4786,9 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {
|
|||
|
||||
if (CurFunctionDef)
|
||||
FuncName = CurFunctionDef->getNameAsString();
|
||||
else if (CurMethodDef) {
|
||||
FuncName = CurMethodDef->getSelector().getAsString();
|
||||
// Convert colons to underscores.
|
||||
std::string::size_type loc = 0;
|
||||
while ((loc = FuncName.find(":", loc)) != std::string::npos)
|
||||
FuncName.replace(loc, 1, "_");
|
||||
} else if (GlobalVarDecl)
|
||||
else if (CurMethodDef)
|
||||
BuildUniqueMethodName(FuncName, CurMethodDef);
|
||||
else if (GlobalVarDecl)
|
||||
FuncName = std::string(GlobalVarDecl->getNameAsString());
|
||||
|
||||
std::string BlockNumber = utostr(Blocks.size()-1);
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
|
||||
// RUN: FileCheck -check-prefix LP --input-file=%t-rw.cpp %s
|
||||
// radar 7630551
|
||||
|
||||
void f(void (^b)(char c));
|
||||
|
||||
@interface a
|
||||
- (void)processStuff;
|
||||
@end
|
||||
|
||||
@implementation a
|
||||
- (void)processStuff {
|
||||
f(^(char x) { });
|
||||
}
|
||||
@end
|
||||
|
||||
@interface b
|
||||
- (void)processStuff;
|
||||
@end
|
||||
|
||||
@implementation b
|
||||
- (void)processStuff {
|
||||
f(^(char x) { });
|
||||
}
|
||||
@end
|
||||
|
||||
// CHECK-LP: struct __a__processStuff_block_impl_0
|
||||
// CHECK-LP: static void __a__processStuff_block_func_0
|
||||
|
||||
// CHECK-LP: struct __b__processStuff_block_impl_0
|
||||
// CHECK-LP: static void __b__processStuff_block_func_0
|
Loading…
Reference in New Issue