Declaring local static in global block

literal declaration caused crash in CodeGen.
This patch fixes it. pr8707

llvm-svn: 120486
This commit is contained in:
Fariborz Jahanian 2010-11-30 23:07:14 +00:00
parent c0f3379ae0
commit 3a4ea9a76c
2 changed files with 32 additions and 3 deletions

View File

@ -145,14 +145,24 @@ static std::string GetStaticDeclName(CodeGenFunction &CGF, const VarDecl &D,
}
std::string ContextName;
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CGF.CurFuncDecl)) {
if (!CGF.CurFuncDecl) {
// Better be in a block declared in global scope.
const NamedDecl *ND = cast<NamedDecl>(&D);
const DeclContext *DC = ND->getDeclContext();
if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
MangleBuffer Name;
CGM.getMangledName(GlobalDecl(), Name, BD);
ContextName = Name.getString();
}
else
assert(0 && "Unknown context for block static var decl");
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CGF.CurFuncDecl)) {
llvm::StringRef Name = CGM.getMangledName(FD);
ContextName = Name.str();
} else if (isa<ObjCMethodDecl>(CGF.CurFuncDecl))
ContextName = CGF.CurFn->getName();
else
// FIXME: What about in a block??
assert(0 && "Unknown context for block var decl");
assert(0 && "Unknown context for static var decl");
return ContextName + Separator + D.getNameAsString();
}

View File

@ -0,0 +1,19 @@
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fblocks -emit-llvm -o - %s | FileCheck %s
// pr8707
// CHECK: @__block_global_0.test = internal global i32
int (^block)(void) = ^ {
static int test=0;
return test;
};
// CHECK: @__block_global_1.test = internal global i32
void (^block1)(void) = ^ {
static int test = 2;
return;
};
// CHECK: @__block_global_2.test = internal global i32
int (^block2)(void) = ^ {
static int test = 5;
return test;
};