blob: bb0f8d881d366ce9f7251f02ebe6d84152b18805 [file] [log] [blame]
Fariborz Jahanian5750b812010-07-09 21:27:28 +00001// RUN: %clang_cc1 -fblocks -fsyntax-only -verify %s
2// rdar: // 6182276
3
4template <typename T, typename T1> void foo(T t, T1 r)
5{
6 T block_arg;
7 __block T1 byref_block_arg;
8
9 T1 (^block)(T) = ^ T1 (T arg) {
10 byref_block_arg = arg;
11 block_arg = arg; // expected-error {{variable is not assignable (missing __block type specifier)}}
12 return block_arg+arg; };
13}
14
Fariborz Jahanian05865202011-12-03 17:47:53 +000015// rdar://10466373
16template <typename T, typename T1> void noret(T t, T1 r)
17{
18 (void) ^{
19 if (1)
20 return t;
21 else if (2)
Fariborz Jahanian649657e2011-12-03 23:53:56 +000022 return r; // expected-error {{return type 'double' must match previous return type 'float' when block literal has unspecified explicit return type}}
Fariborz Jahanian05865202011-12-03 17:47:53 +000023 };
24}
25
Fariborz Jahanian5750b812010-07-09 21:27:28 +000026int main(void)
27{
28 foo(100, 'a'); // expected-note {{in instantiation of function template specialization 'foo<int, char>' requested here}}
Fariborz Jahanian05865202011-12-03 17:47:53 +000029
30 noret((float)0.0, double(0.0)); // expected-note {{in instantiation of function template specialization 'noret<float, double>' requested here}}
Fariborz Jahanian5750b812010-07-09 21:27:28 +000031}
32