[cfe-commits] r75383 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/for-in.m

Daniel Dunbar daniel at zuster.org
Sat Jul 11 13:32:50 PDT 2009


Author: ddunbar
Date: Sat Jul 11 15:32:50 2009
New Revision: 75383

URL: http://llvm.org/viewvc/llvm-project?rev=75383&view=rev
Log:
Generate correct prototype for objc_enumerationMutation.
 - This was a latent bug exposed by the recent objc type changes.

Added:
    cfe/trunk/test/CodeGenObjC/for-in.m
Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=75383&r1=75382&r2=75383&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Sat Jul 11 15:32:50 2009
@@ -314,11 +314,14 @@
   }
   
   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");
   }
   

Added: cfe/trunk/test/CodeGenObjC/for-in.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/for-in.m?rev=75383&view=auto

==============================================================================
--- cfe/trunk/test/CodeGenObjC/for-in.m (added)
+++ cfe/trunk/test/CodeGenObjC/for-in.m Sat Jul 11 15:32:50 2009
@@ -0,0 +1,44 @@
+// RUN: clang-cc -emit-llvm %s -o %t
+
+void p(const char*, ...);
+
+ at interface NSArray
++(NSArray*) arrayWithObjects: (id) first, ...;
+-(unsigned) count;
+ at end
+ at interface NSString
+-(const char*) cString;
+ at 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;
+  }
+}





More information about the cfe-commits mailing list