Transfer calling-convention attributes down to member function pointers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112715 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2010-09-01 16:29:03 +00:00
Родитель 6a081405e3
Коммит afac01d7e7
3 изменённых файлов: 32 добавлений и 2 удалений

Просмотреть файл

@ -1124,6 +1124,15 @@ static QualType getExtFunctionType(ASTContext& Context, QualType T,
return T;
ResultType = Context.getBlockPointerType(ResultType);
} else if (const MemberPointerType *MemberPointer
= T->getAs<MemberPointerType>()) {
QualType Pointee = MemberPointer->getPointeeType();
ResultType = getExtFunctionType(Context, Pointee, Info);
if (ResultType == Pointee)
return T;
ResultType = Context.getMemberPointerType(ResultType,
MemberPointer->getClass());
} else if (const FunctionType *F = T->getAs<FunctionType>()) {
if (F->getExtInfo() == Info)
return T;

Просмотреть файл

@ -1846,7 +1846,8 @@ bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr) {
// Delay if this is not a function or pointer to block.
if (!Type->isFunctionPointerType()
&& !Type->isBlockPointerType()
&& !Type->isFunctionType())
&& !Type->isFunctionType()
&& !Type->isMemberFunctionPointerType())
return true;
if (!GetResultType(Type)->isVoidType()) {
@ -1868,7 +1869,8 @@ bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr) {
// Delay if this is not a function or pointer to block.
if (!Type->isFunctionPointerType()
&& !Type->isBlockPointerType()
&& !Type->isFunctionType())
&& !Type->isFunctionType()
&& !Type->isMemberFunctionPointerType())
return true;
// Otherwise we can process right away.
@ -1894,6 +1896,12 @@ bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr) {
QualType T = Type;
if (const PointerType *PT = Type->getAs<PointerType>())
T = PT->getPointeeType();
else if (const BlockPointerType *BPT = Type->getAs<BlockPointerType>())
T = BPT->getPointeeType();
else if (const MemberPointerType *MPT = Type->getAs<MemberPointerType>())
T = MPT->getPointeeType();
else if (const ReferenceType *RT = Type->getAs<ReferenceType>())
T = RT->getPointeeType();
const FunctionType *Fn = T->getAs<FunctionType>();
// Delay if the type didn't work out to a function.

Просмотреть файл

@ -29,3 +29,16 @@ struct Derived : Base {
virtual void f2() throw(...);
virtual void f3();
};
// __stdcall handling
struct M {
int __stdcall addP();
float __stdcall subtractP();
};
template<typename T> void h1(T (__stdcall M::* const )()) { }
void m1() {
h1<int>(&M::addP);
h1(&M::subtractP);
}