|  | // RUN: %clang_cc1 -fblocks -emit-llvm -o - %s | 
|  |  | 
|  | template <typename T> T foo(T t) | 
|  | { | 
|  | void (^block)(int); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int test1(void) | 
|  | { | 
|  | int i = 1; | 
|  | int b = 2; | 
|  | i = foo(b); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | template <typename T, typename T1> void foo(T t, T1 r) | 
|  | { | 
|  | T block_arg; | 
|  | __block T1 byref_block_arg; | 
|  |  | 
|  | T1 (^block)(char, T, T1, double) = | 
|  | ^ T1 (char ch, T arg, T1 arg2, double d1) { byref_block_arg = arg2; | 
|  | return byref_block_arg + block_arg + arg; }; | 
|  |  | 
|  | void (^block2)() = ^{}; | 
|  | } | 
|  |  | 
|  | void test2(void) | 
|  | { | 
|  | foo(100, 'a'); | 
|  | } | 
|  |  | 
|  | namespace rdar6182276 { | 
|  | extern "C" { | 
|  | int printf(const char *, ...); | 
|  | } | 
|  |  | 
|  | template <typename T> T foo(T t) | 
|  | { | 
|  | void (^testing)(int) = ^(int bar) { printf("bar is %d\n", bar); }; | 
|  | printf("bar is\n"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | template <typename T> void gorf(T t) | 
|  | { | 
|  | foo(t); | 
|  | } | 
|  |  | 
|  |  | 
|  | void test(void) | 
|  | { | 
|  | gorf(2); | 
|  | } | 
|  | } | 
|  |  | 
|  |  |