diff options
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 11 | ||||
-rw-r--r-- | test/CodeGenCXX/cp-blocks-linetables.cpp | 61 |
2 files changed, 65 insertions, 7 deletions
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index e40a731825..f76022fb97 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -881,6 +881,9 @@ public: /// \brief Exit this cleanup scope, emitting any accumulated /// cleanups. ~LexicalScope() { + if (CGDebugInfo *DI = CGF.getDebugInfo()) + DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd()); + // If we should perform a cleanup, force them now. Note that // this ends the cleanup scope before rescoping any labels. if (PerformCleanup) ForceCleanup(); @@ -889,15 +892,9 @@ public: /// \brief Force the emission of cleanups now, instead of waiting /// until this object is destroyed. void ForceCleanup() { + CGF.CurLexicalScope = ParentScope; RunCleanupsScope::ForceCleanup(); - endLexicalScope(); - } - private: - void endLexicalScope() { - CGF.CurLexicalScope = ParentScope; - if (CGDebugInfo *DI = CGF.getDebugInfo()) - DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd()); if (!Labels.empty()) rescopeLabels(); } diff --git a/test/CodeGenCXX/cp-blocks-linetables.cpp b/test/CodeGenCXX/cp-blocks-linetables.cpp new file mode 100644 index 0000000000..d5dd46cbe0 --- /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; +} |