forked from OSchip/llvm-project
Emit an lvalue dynamic_cast even if the result is not used. Another
part (or possibly all) of PR7132. llvm-svn: 103810
This commit is contained in:
parent
6bca984b54
commit
1c073f47da
|
@ -178,7 +178,7 @@ void AggExprEmitter::EmitFinalDestCopy(const Expr *E, LValue Src, bool Ignore) {
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
void AggExprEmitter::VisitCastExpr(CastExpr *E) {
|
void AggExprEmitter::VisitCastExpr(CastExpr *E) {
|
||||||
if (!DestPtr) {
|
if (!DestPtr && E->getCastKind() != CastExpr::CK_Dynamic) {
|
||||||
Visit(E->getSubExpr());
|
Visit(E->getSubExpr());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -186,6 +186,20 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
|
||||||
switch (E->getCastKind()) {
|
switch (E->getCastKind()) {
|
||||||
default: assert(0 && "Unhandled cast kind!");
|
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: {
|
case CastExpr::CK_ToUnion: {
|
||||||
// GCC union extension
|
// GCC union extension
|
||||||
QualType PtrTy =
|
QualType PtrTy =
|
||||||
|
|
|
@ -10,7 +10,7 @@ const B& f(A *a) {
|
||||||
// CHECK: call i8* @__dynamic_cast
|
// CHECK: call i8* @__dynamic_cast
|
||||||
// CHECK: br i1
|
// CHECK: br i1
|
||||||
// CHECK: invoke void @__cxa_bad_cast() noreturn
|
// CHECK: invoke void @__cxa_bad_cast() noreturn
|
||||||
return dynamic_cast<const B&>(*a);
|
dynamic_cast<const B&>(*a);
|
||||||
} catch (std::bad_cast&) {
|
} catch (std::bad_cast&) {
|
||||||
// CHECK: call i8* @llvm.eh.exception
|
// CHECK: call i8* @llvm.eh.exception
|
||||||
// CHECK: {{call.*llvm.eh.selector.*_ZTISt8bad_cast}}
|
// CHECK: {{call.*llvm.eh.selector.*_ZTISt8bad_cast}}
|
||||||
|
|
Loading…
Reference in New Issue