aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprComplex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CGExprComplex.cpp')
-rw-r--r--lib/CodeGen/CGExprComplex.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/CodeGen/CGExprComplex.cpp b/lib/CodeGen/CGExprComplex.cpp
index d2a760054b..7be88440ff 100644
--- a/lib/CodeGen/CGExprComplex.cpp
+++ b/lib/CodeGen/CGExprComplex.cpp
@@ -111,8 +111,24 @@ public:
}
// l-values.
- ComplexPairTy VisitDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); }
- ComplexPairTy VisitBlockDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); }
+ ComplexPairTy emitDeclRef(ValueDecl *VD, Expr *refExpr) {
+ if (CodeGenFunction::ConstantEmission result
+ = CGF.tryEmitAsConstant(VD, refExpr)) {
+ if (result.isReference())
+ return EmitLoadOfLValue(result.getReferenceLValue(CGF, refExpr));
+
+ llvm::ConstantStruct *pair =
+ cast<llvm::ConstantStruct>(result.getValue());
+ return ComplexPairTy(pair->getOperand(0), pair->getOperand(1));
+ }
+ return EmitLoadOfLValue(refExpr);
+ }
+ ComplexPairTy VisitDeclRefExpr(DeclRefExpr *E) {
+ return emitDeclRef(E->getDecl(), E);
+ }
+ ComplexPairTy VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
+ return emitDeclRef(E->getDecl(), E);
+ }
ComplexPairTy VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
return EmitLoadOfLValue(E);
}