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;
|
||||
}
|
||||
|
||||
case CastExpr::CK_BitCast: {
|
||||
// This must be a member function pointer cast.
|
||||
Visit(E->getSubExpr());
|
||||
break;
|
||||
}
|
||||
|
||||
case CastExpr::CK_BaseToDerivedMemberPointer: {
|
||||
QualType SrcType = E->getSubExpr()->getType();
|
||||
|
||||
|
|
|
@ -542,7 +542,11 @@ public:
|
|||
return CS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
case CastExpr::CK_BitCast:
|
||||
// This must be a member function pointer cast.
|
||||
return Visit(E->getSubExpr());
|
||||
|
||||
default: {
|
||||
// FIXME: This should be handled by the CK_NoOp cast kind.
|
||||
// Explicit and implicit no-op casts
|
||||
|
|
|
@ -943,6 +943,7 @@ static TryCastResult TryReinterpretCast(Sema &Self, Expr *SrcExpr,
|
|||
}
|
||||
|
||||
// A valid member pointer cast.
|
||||
Kind = CastExpr::CK_BitCast;
|
||||
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
|
||||
// pointer categories.
|
||||
Kind = CastExpr::CK_BitCast;
|
||||
|
||||
if (SrcType->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
|
||||
// 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".
|
||||
if (CastTy->isVoidType())
|
||||
if (CastTy->isVoidType()) {
|
||||
Kind = CastExpr::CK_ToVoid;
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the type is dependent, we won't do any other semantic analysis now.
|
||||
if (CastTy->isDependentType() || CastExpr->isTypeDependent())
|
||||
|
|
|
@ -71,3 +71,19 @@ namespace PR5177 {
|
|||
|
||||
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