1eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian// RUN: %clang_cc1 -fblocks -emit-llvm -o - %s
2eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian// rdar : // 6182276
3eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian
4eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahaniantemplate <typename T> T foo(T t)
5eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian{
6eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    void (^block)(int);
7eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    return 1;
8eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian}
9eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian
10eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanianint test1(void)
11eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian{
12eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    int i = 1;
13eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    int b = 2;
14eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    i = foo(b);
15eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    return 0;
16eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian}
17eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian
18eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahaniantemplate <typename T, typename T1> void foo(T t, T1 r)
19eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian{
20eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    T block_arg;
21bc9011559b6fd32cf4755bf62652f2950f193f15Fariborz Jahanian    __block T1 byref_block_arg;
22bc9011559b6fd32cf4755bf62652f2950f193f15Fariborz Jahanian
23bc9011559b6fd32cf4755bf62652f2950f193f15Fariborz Jahanian    T1 (^block)(char, T, T1, double) =
24bc9011559b6fd32cf4755bf62652f2950f193f15Fariborz Jahanian	^ T1 (char ch, T arg, T1 arg2, double d1) { byref_block_arg = arg2;
256bb9f78d13adc4adb57e32a16fc3380b47608e56Fariborz Jahanian           					    return byref_block_arg + block_arg + arg; };
26eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian
27eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    void (^block2)() = ^{};
28eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian}
29eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian
30eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanianvoid test2(void)
31eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian{
32eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian    foo(100, 'a');
33eea08b18fa4fa0218be75845d1b77e2ccfe7bd3fFariborz Jahanian}
341256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian
351256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahaniannamespace rdar6182276 {
361256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanianextern "C" {
371256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanianint printf(const char *, ...);
381256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian}
391256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian
401256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahaniantemplate <typename T> T foo(T t)
411256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian{
421256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian    void (^testing)(int) = ^(int bar) { printf("bar is %d\n", bar); };
431256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian    printf("bar is\n");
441256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian    return 1;
451256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian}
461256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian
471256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahaniantemplate <typename T> void gorf(T t)
481256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian{
491256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian    foo(t);
501256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian}
511256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian
521256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian
531256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanianvoid test(void)
541256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian{
551256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian    gorf(2);
561256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian}
571256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian}
581256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian
591256f453f8810ed2df1e33f17378872dd1cb1a0bFariborz Jahanian
60