diff options
author | dim <dim@FreeBSD.org> | 2013-04-08 18:45:10 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2013-04-08 18:45:10 +0000 |
commit | c72c57c9e9b69944e3e009cd5e209634839581d3 (patch) | |
tree | 4fc2f184c499d106f29a386c452b49e5197bf63d /test/CodeGenCXX/cp-blocks-linetables.cpp | |
parent | 5b20025c30d23d521e12c1f33ec8fa6b821952cd (diff) | |
download | FreeBSD-src-c72c57c9e9b69944e3e009cd5e209634839581d3.zip FreeBSD-src-c72c57c9e9b69944e3e009cd5e209634839581d3.tar.gz |
Vendor import of clang trunk r178860:
http://llvm.org/svn/llvm-project/cfe/trunk@178860
Diffstat (limited to 'test/CodeGenCXX/cp-blocks-linetables.cpp')
-rw-r--r-- | test/CodeGenCXX/cp-blocks-linetables.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/test/CodeGenCXX/cp-blocks-linetables.cpp b/test/CodeGenCXX/cp-blocks-linetables.cpp new file mode 100644 index 0000000..d5dd46c --- /dev/null +++ b/test/CodeGenCXX/cp-blocks-linetables.cpp @@ -0,0 +1,61 @@ +// RUN: %clang_cc1 -fblocks -g -emit-llvm %s -o - | FileCheck %s +// Ensure that we generate a line table entry for the block cleanup. +// CHECK: define {{.*}} @__main_block_invoke +// CHECK: _NSConcreteStackBlock +// CHECK: = bitcast {{.*}}, !dbg ![[L1:[0-9]+]] +// CHECK-NOT: call {{.*}} @_Block_object_dispose{{.*}}, !dbg ![[L1]] +// CHECK: ret + +void * _NSConcreteStackBlock; +#ifdef __cplusplus +extern "C" void exit(int); +#else +extern void exit(int); +#endif + +enum numbers { + zero, one, two, three, four +}; + +typedef enum numbers (^myblock)(enum numbers); + + +double test(myblock I) { + return I(three); +} + +int main() { + __block enum numbers x = one; + __block enum numbers y = two; + + /* Breakpoint for first Block function. */ + myblock CL = ^(enum numbers z) + { enum numbers savex = x; + { __block enum numbers x = savex; + y = z; + if (y != three) + exit (6); + test ( + /* Breakpoint for second Block function. */ + ^ (enum numbers z) { + if (y != three) { + exit(1); + } + if (x != one) + exit(2); + x = z; + if (x != three) + exit(3); + if (y != three) + exit(4); + return (enum numbers) four; + });} + return x; + }; + + enum numbers res = (enum numbers)test(CL); + + if (res != one) + exit (5); + return 0; +} |