diff options
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 24 | ||||
-rw-r--r-- | test/CodeGenCXX/const-init-cxx11.cpp | 27 |
2 files changed, 9 insertions, 42 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index f7ab880e6c..125e431bff 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -212,21 +212,18 @@ public: // l-values. Value *VisitDeclRefExpr(DeclRefExpr *E) { Expr::EvalResult Result; - bool IsReferenceConstant = false; - QualType EvalTy = E->getType(); - if (!E->EvaluateAsRValue(Result, CGF.getContext())) { - // If this is a reference, try to determine what it is bound to. - if (!E->getDecl()->getType()->isReferenceType() || - !E->EvaluateAsLValue(Result, CGF.getContext())) - return EmitLoadOfLValue(E); - - IsReferenceConstant = true; - EvalTy = E->getDecl()->getType(); - } + if (!E->EvaluateAsRValue(Result, CGF.getContext())) + return EmitLoadOfLValue(E); assert(!Result.HasSideEffects && "Constant declref with side-effect?!"); - llvm::Constant *C = CGF.CGM.EmitConstantValue(Result.Val, EvalTy, &CGF); + llvm::Constant *C; + if (Result.Val.isInt()) + C = Builder.getInt(Result.Val.getInt()); + else if (Result.Val.isFloat()) + C = llvm::ConstantFP::get(VMContext, Result.Val.getFloat()); + else + return EmitLoadOfLValue(E); // Make sure we emit a debug reference to the global variable. if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) { @@ -236,9 +233,6 @@ public: CGF.EmitDeclRefExprDbgValue(E, C); } - if (IsReferenceConstant) - return EmitLoadOfLValue(CGF.MakeNaturalAlignAddrLValue(C, E->getType())); - return C; } Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) { diff --git a/test/CodeGenCXX/const-init-cxx11.cpp b/test/CodeGenCXX/const-init-cxx11.cpp index e2a11c295f..5366d6d485 100644 --- a/test/CodeGenCXX/const-init-cxx11.cpp +++ b/test/CodeGenCXX/const-init-cxx11.cpp @@ -337,30 +337,3 @@ namespace VirtualBase { X<D> x; // CHECK: call {{.*}}@_ZN11VirtualBase1XINS_1DEEC1Ev } - -// PR12145 -namespace Unreferenced { - int n; - constexpr int *p = &n; - // We must not emit a load of 'p' here, since it's not odr-used. - int q = *p; - // CHECK-NOT: _ZN12Unreferenced1pE - // CHECK: = load i32* @_ZN12Unreferenced1nE - // CHECK-NEXT: store i32 {{.*}}, i32* @_ZN12Unreferenced1qE - // CHECK-NOT: _ZN12Unreferenced1pE - - // Technically, we are not required to substitute variables of reference types - // initialized by constant expressions, because the special case for odr-use - // of variables in [basic.def.odr]p2 only applies to objects. But we do so - // anyway. - - constexpr int &r = n; - // CHECK-NOT: _ZN12Unreferenced1rE - int s = r; - - const int t = 1; - const int &rt = t; - int f(int); - int u = f(rt); - // CHECK: call i32 @_ZN12Unreferenced1fEi(i32 1) -} |