forked from OSchip/llvm-project
Use CK_BitCast for member function pointer casts. Fixes PR5138.
llvm-svn: 84438
This commit is contained in:
parent
70e7eadd15
commit
9500ad13b0
|
@ -215,6 +215,12 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case CastExpr::CK_BitCast: {
|
||||||
|
// This must be a member function pointer cast.
|
||||||
|
Visit(E->getSubExpr());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case CastExpr::CK_BaseToDerivedMemberPointer: {
|
case CastExpr::CK_BaseToDerivedMemberPointer: {
|
||||||
QualType SrcType = E->getSubExpr()->getType();
|
QualType SrcType = E->getSubExpr()->getType();
|
||||||
|
|
||||||
|
|
|
@ -542,7 +542,11 @@ public:
|
||||||
return CS;
|
return CS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case CastExpr::CK_BitCast:
|
||||||
|
// This must be a member function pointer cast.
|
||||||
|
return Visit(E->getSubExpr());
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
// FIXME: This should be handled by the CK_NoOp cast kind.
|
// FIXME: This should be handled by the CK_NoOp cast kind.
|
||||||
// Explicit and implicit no-op casts
|
// Explicit and implicit no-op casts
|
||||||
|
|
|
@ -943,6 +943,7 @@ static TryCastResult TryReinterpretCast(Sema &Self, Expr *SrcExpr,
|
||||||
}
|
}
|
||||||
|
|
||||||
// A valid member pointer cast.
|
// A valid member pointer cast.
|
||||||
|
Kind = CastExpr::CK_BitCast;
|
||||||
return TC_Success;
|
return TC_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,6 +1045,7 @@ static TryCastResult TryReinterpretCast(Sema &Self, Expr *SrcExpr,
|
||||||
|
|
||||||
// Not casting away constness, so the only remaining check is for compatible
|
// Not casting away constness, so the only remaining check is for compatible
|
||||||
// pointer categories.
|
// pointer categories.
|
||||||
|
Kind = CastExpr::CK_BitCast;
|
||||||
|
|
||||||
if (SrcType->isFunctionPointerType()) {
|
if (SrcType->isFunctionPointerType()) {
|
||||||
if (DestType->isFunctionPointerType()) {
|
if (DestType->isFunctionPointerType()) {
|
||||||
|
@ -1085,8 +1087,10 @@ bool Sema::CXXCheckCStyleCast(SourceRange R, QualType CastTy, Expr *&CastExpr,
|
||||||
// This test is outside everything else because it's the only case where
|
// This test is outside everything else because it's the only case where
|
||||||
// a non-lvalue-reference target type does not lead to decay.
|
// a non-lvalue-reference target type does not lead to decay.
|
||||||
// C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void".
|
// C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void".
|
||||||
if (CastTy->isVoidType())
|
if (CastTy->isVoidType()) {
|
||||||
|
Kind = CastExpr::CK_ToVoid;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// If the type is dependent, we won't do any other semantic analysis now.
|
// If the type is dependent, we won't do any other semantic analysis now.
|
||||||
if (CastTy->isDependentType() || CastExpr->isTypeDependent())
|
if (CastTy->isDependentType() || CastExpr->isTypeDependent())
|
||||||
|
|
|
@ -71,3 +71,19 @@ namespace PR5177 {
|
||||||
|
|
||||||
void bar(B1 b2) { while (b2()) ; }
|
void bar(B1 b2) { while (b2()) ; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PR5138
|
||||||
|
namespace PR5138 {
|
||||||
|
struct foo {
|
||||||
|
virtual void bar(foo *);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void baz(foo *);
|
||||||
|
}
|
||||||
|
|
||||||
|
void (foo::*ptr1)(void *) = (void (foo::*)(void *))&foo::bar;
|
||||||
|
void (*ptr2)(void *) = (void (*)(void *))&baz;
|
||||||
|
|
||||||
|
void (foo::*ptr3)(void) = (void (foo::*)(void))&foo::bar;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue