diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-09-01 16:29:03 +0000 | 
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-09-01 16:29:03 +0000 | 
| commit | eece0eaa8500a3ed454026fcbcebdaf9006a9510 (patch) | |
| tree | a36f61ac37cb183b2f08209962892d44a7fdf760 /clang/lib | |
| parent | c19eaaa9d4025ee756e57e1c90285cc471aa33ba (diff) | |
| download | bcm5719-llvm-eece0eaa8500a3ed454026fcbcebdaf9006a9510.tar.gz bcm5719-llvm-eece0eaa8500a3ed454026fcbcebdaf9006a9510.zip  | |
Transfer calling-convention attributes down to member function pointers.
llvm-svn: 112715
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 12 | 
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 574ada39807..4591a0f3c55 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -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; diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 8988de83555..bb2fb990330 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -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.  | 

