diff options
author | Anders Carlsson <andersca@mac.com> | 2010-06-27 17:52:15 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-06-27 17:52:15 +0000 |
commit | 3f48c603fbc3105f11350c397faf5fbf9d2b285d (patch) | |
tree | 5d54059a5e23a4b198b6b4f748ca4213944eb590 /clang/lib/CodeGen/CGDeclCXX.cpp | |
parent | 18c205ecdfc790a9ad516bf764a9182f5ac9c9fa (diff) | |
download | bcm5719-llvm-3f48c603fbc3105f11350c397faf5fbf9d2b285d.tar.gz bcm5719-llvm-3f48c603fbc3105f11350c397faf5fbf9d2b285d.zip |
Correctly destroy reference temporaries with global storage. Remove ErrorUnsupported call when binding a global reference to a non-lvalue. Fixes PR7326.
llvm-svn: 106983
Diffstat (limited to 'clang/lib/CodeGen/CGDeclCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGDeclCXX.cpp | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index 7fdb895e8ed..3f4919fbe9c 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -93,13 +93,9 @@ void CodeGenFunction::EmitCXXGlobalVarDeclInit(const VarDecl &D, EmitDeclDestroy(*this, D, DeclPtr); return; } - if (Init->isLvalue(getContext()) == Expr::LV_Valid) { - RValue RV = EmitReferenceBindingToExpr(Init, &D); - EmitStoreOfScalar(RV.getScalarVal(), DeclPtr, false, T); - return; - } - ErrorUnsupported(Init, - "global variable that binds reference to a non-lvalue"); + + RValue RV = EmitReferenceBindingToExpr(Init, &D); + EmitStoreOfScalar(RV.getScalarVal(), DeclPtr, false, T); } void @@ -373,11 +369,7 @@ CodeGenFunction::EmitStaticCXXBlockVarDeclInit(const VarDecl &D, if (D.getType()->isReferenceType()) { QualType T = D.getType(); - // We don't want to pass true for IsInitializer here, because a static - // reference to a temporary does not extend its lifetime. - // FIXME: This is incorrect. - RValue RV = EmitReferenceBindingToExpr(D.getInit(), - /*InitializedDecl=*/0); + RValue RV = EmitReferenceBindingToExpr(D.getInit(), &D); EmitStoreOfScalar(RV.getScalarVal(), GV, /*Volatile=*/false, T); } else |