diff options
Diffstat (limited to 'test/Analysis/stack-addr-ps.c')
-rw-r--r-- | test/Analysis/stack-addr-ps.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/test/Analysis/stack-addr-ps.c b/test/Analysis/stack-addr-ps.c index 558986d..a443a32 100644 --- a/test/Analysis/stack-addr-ps.c +++ b/test/Analysis/stack-addr-ps.c @@ -57,8 +57,15 @@ int struct_test(struct baz byVal, int flag) { typedef int (^ComparatorBlock)(int a, int b); ComparatorBlock test_return_block(void) { + // This block is a global since it has no captures. ComparatorBlock b = ^int(int a, int b){ return a > b; }; - return b; // expected-warning{{Address of stack-allocated block declared on line 60 returned to caller}} + return b; // no-warning +} + +ComparatorBlock test_return_block_with_capture(int x) { + // This block is stack allocated because it has captures. + ComparatorBlock b = ^int(int a, int b){ return a > b + x; }; + return b; // expected-warning{{Address of stack-allocated block}} } ComparatorBlock test_return_block_neg_aux(void); @@ -73,4 +80,13 @@ int *rdar_7523821_f2() { return a; // expected-warning 2 {{ddress of stack memory associated with local variable 'a' returned}} }; +// Handle blocks that have no captures or are otherwise declared 'static'. +// <rdar://problem/10348049> +typedef int (^RDar10348049)(int value); +RDar10348049 test_rdar10348049(void) { + static RDar10348049 b = ^int(int x) { + return x + 2; + }; + return b; // no-warning +} |