]> granicus.if.org Git - clang/commitdiff
Generate correct prototype for objc_enumerationMutation.
authorDaniel Dunbar <daniel@zuster.org>
Sat, 11 Jul 2009 20:32:50 +0000 (20:32 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 11 Jul 2009 20:32:50 +0000 (20:32 +0000)
 - This was a latent bug exposed by the recent objc type changes.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75383 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjCMac.cpp
test/CodeGenObjC/for-in.m [new file with mode: 0644]

index 4677e1d754d6d6cf8a67c890c8bfbdbb309c8a3c..699fb9aa193092fe22fcfe4b3880de3a8f67056b 100644 (file)
@@ -314,11 +314,14 @@ public:
   }
   
   llvm::Constant *getEnumerationMutationFn() {
+    CodeGen::CodeGenTypes &Types = CGM.getTypes();
+    ASTContext &Ctx = CGM.getContext();
     // void objc_enumerationMutation (id)
-    std::vector<const llvm::Type*> Args;
-    Args.push_back(ObjectPtrTy);
-    llvm::FunctionType *FTy = 
-      llvm::FunctionType::get(llvm::Type::VoidTy, Args, false);
+    llvm::SmallVector<QualType,16> Params;
+    QualType IdType = Ctx.getObjCIdType();
+    Params.push_back(IdType);
+    const llvm::FunctionType *FTy =
+      Types.GetFunctionType(Types.getFunctionInfo(Ctx.VoidTy, Params), false);
     return CGM.CreateRuntimeFunction(FTy, "objc_enumerationMutation");
   }
   
diff --git a/test/CodeGenObjC/for-in.m b/test/CodeGenObjC/for-in.m
new file mode 100644 (file)
index 0000000..434ff79
--- /dev/null
@@ -0,0 +1,44 @@
+// RUN: clang-cc -emit-llvm %s -o %t
+
+void p(const char*, ...);
+
+@interface NSArray
++(NSArray*) arrayWithObjects: (id) first, ...;
+-(unsigned) count;
+@end
+@interface NSString
+-(const char*) cString;
+@end
+
+#define S(n) @#n
+#define L1(n) S(n+0),S(n+1)
+#define L2(n) L1(n+0),L1(n+2)
+#define L3(n) L2(n+0),L2(n+4)
+#define L4(n) L3(n+0),L3(n+8)
+#define L5(n) L4(n+0),L4(n+16)
+#define L6(n) L5(n+0),L5(n+32)
+
+void t0() {
+  NSArray *array = [NSArray arrayWithObjects: L1(0), (void*)0];
+
+  p("array.length: %d\n", [array count]);
+  unsigned index = 0;
+  for (NSString *i in array) {
+    p("element %d: %s\n", index++, [i cString]);
+  }
+}
+
+void t1() {
+  NSArray *array = [NSArray arrayWithObjects: L6(0), (void*)0];
+
+  p("array.length: %d\n", [array count]);
+  unsigned index = 0;
+  for (NSString *i in array) {
+    index++;
+    if (index == 10)
+      continue;
+    p("element %d: %s\n", index, [i cString]);
+    if (index == 55)
+      break;
+  }
+}