From: Daniel Dunbar Date: Sat, 11 Jul 2009 20:32:50 +0000 (+0000) Subject: Generate correct prototype for objc_enumerationMutation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c1ab900fa5e9b8a09b042992eeca29f413b1d595;p=clang Generate correct prototype for objc_enumerationMutation. - 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 --- diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 4677e1d754..699fb9aa19 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -314,11 +314,14 @@ public: } llvm::Constant *getEnumerationMutationFn() { + CodeGen::CodeGenTypes &Types = CGM.getTypes(); + ASTContext &Ctx = CGM.getContext(); // void objc_enumerationMutation (id) - std::vector Args; - Args.push_back(ObjectPtrTy); - llvm::FunctionType *FTy = - llvm::FunctionType::get(llvm::Type::VoidTy, Args, false); + llvm::SmallVector 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 index 0000000000..434ff796b3 --- /dev/null +++ b/test/CodeGenObjC/for-in.m @@ -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; + } +}