Unify the BlockDeclRefExpr and DeclRefExpr paths so that
we correctly emit loads of BlockDeclRefExprs even when they
don't qualify as ODR-uses. I think I'm adequately convinced
that BlockDeclRefExpr can die.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152479 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprComplex.cpp b/lib/CodeGen/CGExprComplex.cpp
index d2a7600..7be8844 100644
--- a/lib/CodeGen/CGExprComplex.cpp
+++ b/lib/CodeGen/CGExprComplex.cpp
@@ -111,8 +111,24 @@
}
// 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);
}