Have __func__ and siblings point to block's implementation function

name. Fixes radar 7860965.

llvm-svn: 107044
This commit is contained in:
Fariborz Jahanian 2010-06-28 18:58:34 +00:00
parent 0d94d7af78
commit 36ad0e99d5
2 changed files with 30 additions and 1 deletions

View File

@ -840,11 +840,22 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, const BlockExpr *BExpr,
CGM.SetInternalFunctionAttributes(BD, Fn, FI);
QualType FnType(BlockFunctionType, 0);
bool HasPrototype = (dyn_cast<FunctionProtoType>(BlockFunctionType) != 0);
IdentifierInfo *ID = &getContext().Idents.get(Name.getString());
CurCodeDecl = FunctionDecl::Create(getContext(),
getContext().getTranslationUnitDecl(),
SourceLocation(), ID, FnType,
0,
FunctionDecl::Static,
FunctionDecl::None,
false, HasPrototype);
StartFunction(BD, ResultType, Fn, Args,
BExpr->getBody()->getLocEnd());
CurFuncDecl = OuterFuncDecl;
CurCodeDecl = BD;
// If we have a C++ 'this' reference, go ahead and force it into
// existence now.

View File

@ -0,0 +1,18 @@
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fblocks -emit-llvm -o - %s | FileCheck %s
// rdar: // 7860965
extern void PRINTF(const char *);
extern void B(void (^)(void));
int main()
{
PRINTF(__func__);
B(
^{
PRINTF(__func__);
}
);
return 0; // not reached
}
// CHECK: call void @PRINTF({{.*}}@__func__.__main_block_invoke_