diff options
Diffstat (limited to 'test/CodeGenObjC/debug-info-block-line.m')
-rw-r--r-- | test/CodeGenObjC/debug-info-block-line.m | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/test/CodeGenObjC/debug-info-block-line.m b/test/CodeGenObjC/debug-info-block-line.m new file mode 100644 index 0000000..c913a97 --- /dev/null +++ b/test/CodeGenObjC/debug-info-block-line.m @@ -0,0 +1,89 @@ +// REQUIRES: x86-64-registered-target +// RUN: %clang_cc1 -emit-llvm -fblocks -fobjc-default-synthesize-properties -fobjc-arc -O0 -g -triple x86_64-apple-darwin10 %s -o - | FileCheck %s + +// rdar://11562117 +typedef unsigned int NSUInteger; +typedef long NSInteger; +typedef signed char BOOL; + +#define nil ((void*) 0) +#define YES ((BOOL)1) +#define NO ((BOOL)0) + +@interface NSObject +- (id)init; +@end + +@interface NSError : NSObject +@end + +@interface NSString : NSObject +@end + +@interface NSString (NSStringExtensionMethods) +- (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOL *stop))block; +@end + +@interface NSData : NSObject +@end + +@interface NSData (ASBase64) +- (NSString *)encodedString:(NSInteger)position; +- (NSData *)compressedData; +@end + +typedef void (^TDataCompletionBlock)(NSData *data, NSError *error); +@interface TMap : NSObject +- (NSString *)identifier; +- (NSString *)name; ++ (TMap *)mapForID:(NSString *)identifier; +- (void)dataWithCompletionBlock:(TDataCompletionBlock)block; +@end + +typedef enum : NSUInteger { + TOK = 100, + TError = 125, +} TResponseCode; + +@interface TConnection : NSObject +- (void)sendString:(NSString *)string; +- (void)sendFormat:(NSString *)format, ...; +- (void)sendResponseCode:(TResponseCode)responseCode dataFollows:(BOOL)flag + format:(NSString *)format, ...; +@end + +@interface TServer : NSObject +@end + +@implementation TServer +- (void)serverConnection:(TConnection *)connection getCommand:(NSString *)str +{ + NSString *mapID = nil; + TMap *map = [TMap mapForID:mapID]; +// Make sure we do not map code generated for the block to the above line. +// CHECK: define internal void @"__39-[TServer serverConnection:getCommand:]_block_invoke" +// CHECK: call void @objc_storeStrong(i8** [[ZERO:%.*]], i8* [[ONE:%.*]]) [[NUW:#[0-9]+]] +// CHECK: call void @objc_storeStrong(i8** [[TWO:%.*]], i8* [[THREE:%.*]]) [[NUW]] +// CHECK: bitcast %5** [[TMP:%.*]] to i8** +// CHECK: call void @objc_storeStrong(i8** [[VAL1:%.*]], i8* null) [[NUW]], !dbg ![[MD1:.*]] +// CHECK: bitcast %4** [[TMP:%.*]] to i8** +// CHECK: call void @objc_storeStrong(i8** [[VAL2:%.*]], i8* null) [[NUW]], !dbg ![[MD1]] +// CHECK-NEXT: ret +// CHECK: attributes [[NUW]] = { nounwind } +// CHECK: ![[MD1]] = metadata !{i32 87 + [map dataWithCompletionBlock:^(NSData *data, NSError *error) { + if (data) { + NSString *encoded = [[data compressedData] encodedString:18]; + [connection sendResponseCode:TOK dataFollows:YES + format:@"Sending \"%@\" (%@)", [map name], [map identifier]]; + [encoded enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) { + [connection sendFormat:@"%@\r\n", line]; + }]; + [connection sendString:@".\r\n"]; + } else { + [connection sendResponseCode:TError dataFollows:NO + format:@"Failed \"%@\" (%@)", [map name], [map identifier]]; + } + }]; +} +@end |