diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-05-14 21:31:02 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-05-14 21:31:02 +0000 |
| commit | 1c073f47dabf7e597263f483b5d7c535e6ef6885 (patch) | |
| tree | f7f106e31ab807354899859e51c7c699b487c7a6 | |
| parent | 6bca984b5438540fd6433e9fa10009241a139fbb (diff) | |
| download | bcm5719-llvm-1c073f47dabf7e597263f483b5d7c535e6ef6885.tar.gz bcm5719-llvm-1c073f47dabf7e597263f483b5d7c535e6ef6885.zip | |
Emit an lvalue dynamic_cast even if the result is not used. Another
part (or possibly all) of PR7132.
llvm-svn: 103810
| -rw-r--r-- | clang/lib/CodeGen/CGExprAgg.cpp | 16 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/dynamic-cast.cpp | 2 |
2 files changed, 16 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index ce9ad4886ff..5a1516cf32a 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -178,7 +178,7 @@ void AggExprEmitter::EmitFinalDestCopy(const Expr *E, LValue Src, bool Ignore) { //===----------------------------------------------------------------------===// void AggExprEmitter::VisitCastExpr(CastExpr *E) { - if (!DestPtr) { + if (!DestPtr && E->getCastKind() != CastExpr::CK_Dynamic) { Visit(E->getSubExpr()); return; } @@ -186,6 +186,20 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) { switch (E->getCastKind()) { default: assert(0 && "Unhandled cast kind!"); + case CastExpr::CK_Dynamic: { + assert(isa<CXXDynamicCastExpr>(E) && "CK_Dynamic without a dynamic_cast?"); + LValue LV = CGF.EmitCheckedLValue(E->getSubExpr()); + // FIXME: Do we also need to handle property references here? + if (LV.isSimple()) + CGF.EmitDynamicCast(LV.getAddress(), cast<CXXDynamicCastExpr>(E)); + else + CGF.CGM.ErrorUnsupported(E, "non-simple lvalue dynamic_cast"); + + if (DestPtr) + CGF.CGM.ErrorUnsupported(E, "lvalue dynamic_cast with a destination"); + break; + } + case CastExpr::CK_ToUnion: { // GCC union extension QualType PtrTy = diff --git a/clang/test/CodeGenCXX/dynamic-cast.cpp b/clang/test/CodeGenCXX/dynamic-cast.cpp index 572b521c925..2bf1aeed492 100644 --- a/clang/test/CodeGenCXX/dynamic-cast.cpp +++ b/clang/test/CodeGenCXX/dynamic-cast.cpp @@ -10,7 +10,7 @@ const B& f(A *a) { // CHECK: call i8* @__dynamic_cast // CHECK: br i1 // CHECK: invoke void @__cxa_bad_cast() noreturn - return dynamic_cast<const B&>(*a); + dynamic_cast<const B&>(*a); } catch (std::bad_cast&) { // CHECK: call i8* @llvm.eh.exception // CHECK: {{call.*llvm.eh.selector.*_ZTISt8bad_cast}} |

