summaryrefslogtreecommitdiffstats
path: root/clang/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/CodeGen/CGExprConstant.cpp')
-rw-r--r--clang/CodeGen/CGExprConstant.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/clang/CodeGen/CGExprConstant.cpp b/clang/CodeGen/CGExprConstant.cpp
index 1a60cae5a07..ec16b16a9d4 100644
--- a/clang/CodeGen/CGExprConstant.cpp
+++ b/clang/CodeGen/CGExprConstant.cpp
@@ -25,9 +25,10 @@ namespace {
class VISIBILITY_HIDDEN ConstExprEmitter :
public StmtVisitor<ConstExprEmitter, llvm::Constant*> {
CodeGenModule &CGM;
+ CodeGenFunction *CGF;
public:
- ConstExprEmitter(CodeGenModule &cgm)
- : CGM(cgm) {
+ ConstExprEmitter(CodeGenModule &cgm, CodeGenFunction *cgf)
+ : CGM(cgm), CGF(cgf) {
}
//===--------------------------------------------------------------------===//
@@ -534,8 +535,10 @@ public:
return CGM.GetAddrOfFunctionDecl(FD, false);
if (const FileVarDecl* VD = dyn_cast<FileVarDecl>(Decl))
return CGM.GetAddrOfGlobalVar(VD, false);
- // We can end up here with static block-scope variables (and others?)
- // FIXME: How do we implement block-scope variables?!
+ if (const BlockVarDecl* BVD = dyn_cast<BlockVarDecl>(Decl)) {
+ assert(CGF && "Can't access static local vars without CGF");
+ return CGF->GetAddrOfStaticLocalVar(BVD);
+ }
break;
}
case Expr::MemberExprClass: {
@@ -604,7 +607,8 @@ public:
} // end anonymous namespace.
-llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E)
+llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
+ CodeGenFunction *CGF)
{
QualType type = E->getType().getCanonicalType();
@@ -616,5 +620,5 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E)
}
}
- return ConstExprEmitter(*this).Visit(const_cast<Expr*>(E));
+ return ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E));
}
OpenPOWER on IntegriCloud