From: Steve Naroff Date: Wed, 16 Jul 2008 14:40:40 +0000 (+0000) Subject: Teach RewriteObjC::RewriteObjCMethodDecl() to deal with pointer to function return... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=76e429d781a8871afb5050f39ab8e00e72bdf2f8;p=clang Teach RewriteObjC::RewriteObjCMethodDecl() to deal with pointer to function return types. This fixes clang ObjC rewriter: rewriting methods with function pointer return values does not work git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53678 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp index c369f0fcf6..0154aaebd9 100644 --- a/Driver/RewriteObjC.cpp +++ b/Driver/RewriteObjC.cpp @@ -667,10 +667,22 @@ void RewriteObjC::RewriteForwardProtocolDecl(ObjCForwardProtocolDecl *PDecl) { void RewriteObjC::RewriteObjCMethodDecl(ObjCMethodDecl *OMD, std::string &ResultStr) { + const FunctionType *FPRetType = 0; ResultStr += "\nstatic "; if (OMD->getResultType()->isObjCQualifiedIdType()) ResultStr += "id"; - else + else if (OMD->getResultType()->isFunctionPointerType()) { + // needs special handling, since pointer-to-functions have special + // syntax (where a decaration models use). + QualType retType = OMD->getResultType(); + if (const PointerType* PT = retType->getAsPointerType()) { + QualType PointeeTy = PT->getPointeeType(); + if ((FPRetType = PointeeTy->getAsFunctionType())) { + ResultStr += FPRetType->getResultType().getAsString(); + ResultStr += "(*"; + } + } + } else ResultStr += OMD->getResultType().getAsString(); ResultStr += " "; @@ -745,6 +757,26 @@ void RewriteObjC::RewriteObjCMethodDecl(ObjCMethodDecl *OMD, ResultStr += ", ..."; ResultStr += ") "; + if (FPRetType) { + ResultStr += ")"; // close the precedence "scope" for "*". + + // Now, emit the argument types (if any). + if (const FunctionTypeProto *FT = dyn_cast(FPRetType)) { + ResultStr += "("; + for (unsigned i = 0, e = FT->getNumArgs(); i != e; ++i) { + if (i) ResultStr += ", "; + std::string ParamStr = FT->getArgType(i).getAsString(); + ResultStr += ParamStr; + } + if (FT->isVariadic()) { + if (FT->getNumArgs()) ResultStr += ", "; + ResultStr += "..."; + } + ResultStr += ")"; + } else { + ResultStr += "()"; + } + } } void RewriteObjC::RewriteImplementationDecl(NamedDecl *OID) { ObjCImplementationDecl *IMD = dyn_cast(OID);