// REQUIRES: x86-registered-target
// RUN: %clang_cc1 -emit-llvm -fblocks -fobjc-arc -debug-info-kind=limited -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: call {{.*}}@objc_msgSend{{.*}}, !dbg ![[LINE_ABOVE:[0-9]+]]
// CHECK: getelementptr
// CHECK-NOT: !dbg, ![[LINE_ABOVE]]
// CHECK: bitcast %5** [[TMP:%.*]] to i8**
// CHECK-NOT: !dbg, ![[LINE_ABOVE]]
// CHECK: call void @objc_storeStrong(i8** [[VAL1:%.*]], i8* null) [[NUW]]
// CHECK-NEXT: bitcast %4** [[TMP:%.*]] to i8**
// CHECK-NEXT: call void @objc_storeStrong(i8** [[VAL2:%.*]], i8* null) [[NUW]]
// CHECK-NEXT: ret
// CHECK: attributes [[NUW]] = { nounwind }
    [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
