diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-05-19 04:48:36 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-05-19 04:48:36 +0000 |
| commit | c82b86dfaa96cadc561b5ccd2b5b37dfae4530cf (patch) | |
| tree | dc3d49941df581e205e78fa6c11a5f554616ee38 /clang/lib/CodeGen/CGExprAgg.cpp | |
| parent | 549c5bd8248b868f46ae36012e42f3e05adb8330 (diff) | |
Have AggExprEmitter::VisitCXXConstructExpr make new variables if necessary. Stub out VisitCXXExprWithTemporaries.
llvm-svn: 72103
Diffstat (limited to 'clang/lib/CodeGen/CGExprAgg.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGExprAgg.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index b216cf70a49b..92e535a5f062 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -99,6 +99,8 @@ public: Visit(DAE->getExpr()); } void VisitCXXConstructExpr(const CXXConstructExpr *E); + void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E); + void VisitVAArgExpr(VAArgExpr *E); void EmitInitializationToLValue(Expr *E, LValue Address); @@ -295,9 +297,22 @@ void AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) { void AggExprEmitter::VisitCXXConstructExpr(const CXXConstructExpr *E) { - assert(DestPtr && "Must have a dest to emit into!"); + llvm::Value *V = DestPtr; + + if (!V) { + assert(isa<CXXTempVarDecl>(E->getVarDecl()) && + "Must have a temp var decl when there's no destination!"); + + V = CGF.CreateTempAlloca(CGF.ConvertType(E->getVarDecl()->getType()), + "tmpvar"); + } - CGF.EmitCXXConstructExpr(DestPtr, E); + CGF.EmitCXXConstructExpr(V, E); +} + +void AggExprEmitter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) { + // FIXME: Do something with the temporaries! + Visit(E->getSubExpr()); } void AggExprEmitter::EmitInitializationToLValue(Expr* E, LValue LV) { |
