diff options
author | Tim Shen <timshen91@gmail.com> | 2016-07-01 21:08:47 +0000 |
---|---|---|
committer | Tim Shen <timshen91@gmail.com> | 2016-07-01 21:08:47 +0000 |
commit | 421119fd891cc68d76f28bd0d9afa78e222e3a04 (patch) | |
tree | 302448290d3e873dde526799aa6ea76c20f0e689 /clang/test/CodeGen/temporary-lifetime-exceptions.cpp | |
parent | 1bba89612b1a03bf3f35455e2ae1e2fb3af7849a (diff) | |
download | bcm5719-llvm-421119fd891cc68d76f28bd0d9afa78e222e3a04.tar.gz bcm5719-llvm-421119fd891cc68d76f28bd0d9afa78e222e3a04.zip |
[Temporary, Lifetime] Add lifetime marks for temporaries
With all MaterializeTemporaryExprs coming with a ExprWithCleanups, it's
easy to add correct lifetime.end marks into the right RunCleanupsScope.
Differential Revision: http://reviews.llvm.org/D20499
llvm-svn: 274385
Diffstat (limited to 'clang/test/CodeGen/temporary-lifetime-exceptions.cpp')
-rw-r--r-- | clang/test/CodeGen/temporary-lifetime-exceptions.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/clang/test/CodeGen/temporary-lifetime-exceptions.cpp b/clang/test/CodeGen/temporary-lifetime-exceptions.cpp new file mode 100644 index 00000000000..17e21683f22 --- /dev/null +++ b/clang/test/CodeGen/temporary-lifetime-exceptions.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 %s -fexceptions -fcxx-exceptions -std=c++11 -O1 -triple x86_64 -emit-llvm -o - | FileCheck %s + +// lifetime.end should be invoked even if the destructor doesn't run due to an +// exception thrown from previous ctor call. + +struct A { A(); ~A(); }; +A Baz(const A&); + +void Test1() { + // CHECK-LABEL: @_Z5Test1v( + // CHECK: getelementptr + // CHECK-NEXT: call void @llvm.lifetime.start(i64 1, i8* [[TMP:[^ ]+]]) + // CHECK-NEXT: getelementptr + // CHECK-NEXT: call void @llvm.lifetime.start(i64 1, i8* [[TMP1:[^ ]+]]) + + // Normal exit + // CHECK: call void @llvm.lifetime.end(i64 1, i8* [[TMP1]]) + // CHECK-NEXT: call void @llvm.lifetime.end(i64 1, i8* [[TMP]]) + + // Exception exit + // CHECK: call void @llvm.lifetime.end(i64 1, i8* [[TMP1]]) + // CHECK-NEXT: call void @llvm.lifetime.end(i64 1, i8* [[TMP]]) + Baz(Baz(A())); +} |