diff options
Diffstat (limited to 'clang/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | clang/CodeGen/CGExprConstant.cpp | 16 |
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)); } |