diff options
author | Steve Naroff <snaroff@apple.com> | 2008-09-16 22:25:10 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2008-09-16 22:25:10 +0000 |
commit | 3b1e172d7ef08504b001aac21a15ada002d0993e (patch) | |
tree | 8a06b53bb9173261a7da1eee5e6122e8cb685f28 /clang/test/Sema/block-return.c | |
parent | 64d6c6fe301b987afba0cb07961400d11e463967 (diff) | |
download | bcm5719-llvm-3b1e172d7ef08504b001aac21a15ada002d0993e.tar.gz bcm5719-llvm-3b1e172d7ef08504b001aac21a15ada002d0993e.zip |
Sema::ActOnBlockReturnStmt(): Need to perform the UsualUnaryConversions on the return type.
Sema::CheckReturnStackAddr(): Make sure we skip over implicit casts.
Added some more test cases...
llvm-svn: 56254
Diffstat (limited to 'clang/test/Sema/block-return.c')
-rw-r--r-- | clang/test/Sema/block-return.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/clang/test/Sema/block-return.c b/clang/test/Sema/block-return.c new file mode 100644 index 00000000000..93511dbd7e3 --- /dev/null +++ b/clang/test/Sema/block-return.c @@ -0,0 +1,52 @@ +// RUN: clang -fsyntax-only %s -verify + +typedef void (^CL)(void); + +CL foo() { + + short y; + + short (^add1)(void) = ^{ return y+1; }; // expected-error {{incompatible block pointer types initializing 'int (^)(void)', expected 'short (^)(void)'}} + + CL X = ^{ + if (2) + return; + return 1; // expected-error {{void block should not return a value}} + }; + int (^Y) (void) = ^{ + if (3) + return 1; + else + return; // expected-error {{non-void block should return a value}} + }; + + char *(^Z)(void) = ^{ + if (3) + return ""; + else + return (char*)0; + }; + + double (^A)(void) = ^ { // expected-error {{incompatible block pointer types initializing 'float (^)(void)', expected 'double (^)(void)'}} + if (1) + return (float)1.0; + else + if (2) + return (double)2.0; // expected-error {{incompatible type returning 'double', expected 'float'}} + return 1; // expected-error {{incompatible type returning 'int', expected 'float'}} + }; + + char *(^B)(void) = ^{ + if (3) + return ""; + else + return 2; // expected-error {{incompatible type returning 'int', expected 'char *'}} + }; + return ^{ return 1; }; // expected-error {{incompatible block pointer types returning 'int (^)(void)', expected 'CL'}} expected-error {{returning block that lives on the local stack}} +} + +typedef int (^CL2)(void); + +CL2 foo2() { + return ^{ return 1; }; // expected-error {{returning block that lives on the local stack}} +} |