aboutsummaryrefslogtreecommitdiff
path: root/Driver/RewriteTest.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2007-10-31 04:38:33 +0000
committerSteve Naroff <snaroff@apple.com>2007-10-31 04:38:33 +0000
commit9165ad378f8d25eb5c378a8e9540089afce421ff (patch)
tree5a38ffa38b63b63d0c4cff4164f2a1527e20bbe4 /Driver/RewriteTest.cpp
parent8baaca50f07d0c10bba69c8d88c1b9078c92d06d (diff)
Add some plumbing to help cope with rewriting "id<p>", "Class<p>*".
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43543 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Driver/RewriteTest.cpp')
-rw-r--r--Driver/RewriteTest.cpp37
1 files changed, 34 insertions, 3 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index 8f3b754195..788b522612 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -64,6 +64,8 @@ namespace {
void RewriteProtocolDecl(ObjcProtocolDecl *Dcl);
void RewriteMethods(int nMethods, ObjcMethodDecl **Methods);
void RewriteFunctionDecl(FunctionDecl *FD);
+ bool functionReferencesAnyObjcQualifiedInterfaceTypes(
+ const FunctionTypeProto *proto);
// Expression Rewriting.
Stmt *RewriteFunctionBody(Stmt *S);
@@ -402,12 +404,41 @@ CallExpr *RewriteTest::SynthesizeCallToFunctionDecl(
return new CallExpr(ICE, args, nargs, FT->getResultType(), SourceLocation());
}
+bool RewriteTest::functionReferencesAnyObjcQualifiedInterfaceTypes(
+ const FunctionTypeProto *proto) {
+ const PointerType *pType = proto->getResultType()->getAsPointerType();
+ if (pType) {
+ Type *pointeeType = pType->getPointeeType().getTypePtr();
+ if (isa<ObjcQualifiedInterfaceType>(pointeeType))
+ return true; // we have "Class <Protocol> *".
+ }
+ // Now check arguments.
+ for (unsigned i = 0; i < proto->getNumArgs(); i++) {
+ pType = proto->getArgType(i)->getAsPointerType();
+ if (pType) {
+ Type *pointeeType = pType->getPointeeType().getTypePtr();
+ if (isa<ObjcQualifiedInterfaceType>(pointeeType))
+ return true;
+ }
+ }
+ // FIXME: we don't currently represent "id <Protocol>" in the type system.
+ return false;
+}
+
void RewriteTest::RewriteFunctionDecl(FunctionDecl *FD) {
// declared in <objc/objc.h>
- if (strcmp(FD->getName(), "sel_getUid") == 0)
+ if (strcmp(FD->getName(), "sel_getUid") == 0) {
SelGetUidFunctionDecl = FD;
-
- // FIXME: Check if any types are isa<ObjcQualifiedInterfaceType> (yuck).
+ return;
+ }
+ // Check for ObjC 'id' and class types that have been adorned with protocol
+ // information (id<p>, C<p>*). The protocol references need to be rewritten!
+ const FunctionType *funcType = FD->getType()->getAsFunctionType();
+ assert(funcType && "missing function type");
+ const FunctionTypeProto *proto = dyn_cast<FunctionTypeProto>(funcType);
+ if (proto && functionReferencesAnyObjcQualifiedInterfaceTypes(proto)) {
+ // FIXME: Rewrite function decl...
+ }
}
// SynthMsgSendFunctionDecl - id objc_msgSend(id self, SEL op, ...);