[cfe-commits] r53678 - /cfe/trunk/Driver/RewriteObjC.cpp

Steve Naroff snaroff at apple.com
Wed Jul 16 07:40:42 PDT 2008


Author: snaroff
Date: Wed Jul 16 09:40:40 2008
New Revision: 53678

URL: http://llvm.org/viewvc/llvm-project?rev=53678&view=rev
Log:
Teach RewriteObjC::RewriteObjCMethodDecl() to deal with pointer to function return types.
This fixes <rdar://problem/6034961> clang ObjC rewriter: rewriting methods with function pointer return values does not work

Modified:
    cfe/trunk/Driver/RewriteObjC.cpp

Modified: cfe/trunk/Driver/RewriteObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteObjC.cpp?rev=53678&r1=53677&r2=53678&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteObjC.cpp (original)
+++ cfe/trunk/Driver/RewriteObjC.cpp Wed Jul 16 09:40:40 2008
@@ -667,10 +667,22 @@
 
 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 @@
     ResultStr += ", ...";
   ResultStr += ") ";
   
+  if (FPRetType) {
+    ResultStr += ")"; // close the precedence "scope" for "*".
+    
+    // Now, emit the argument types (if any).
+    if (const FunctionTypeProto *FT = dyn_cast<FunctionTypeProto>(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<ObjCImplementationDecl>(OID);





More information about the cfe-commits mailing list