diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2018-04-27 06:57:00 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2018-04-27 06:57:00 +0000 |
commit | ccda3d297023091f6468ad195c68b250c474a45a (patch) | |
tree | e8552b0b8d4d92f599ebb46243f5b7e2b5cde863 /clang/test/CodeGenObjCXX/lambda-expressions.mm | |
parent | b4f3637cec2f4b914528bc6b27d00b8317f7a995 (diff) | |
download | bcm5719-llvm-ccda3d297023091f6468ad195c68b250c474a45a.tar.gz bcm5719-llvm-ccda3d297023091f6468ad195c68b250c474a45a.zip |
[CodeGen] Avoid destructing a callee-destructued struct type in a
function if a function delegates to another function.
Fix a bug introduced in r328731, which caused a struct with ObjC __weak
fields that was passed to a function to be destructed twice, once in the
callee function and once in another function the callee function
delegates to. To prevent this, keep track of the callee-destructed
structs passed to a function and disable their cleanups at the point of
the call to the delegated function.
This reapplies r331016, which was reverted in r331019 because it caused
an assertion to fail in EmitDelegateCallArg on a windows bot. I made
changes to EmitDelegateCallArg so that it doesn't try to deactivate
cleanups for structs that have trivial destructors (cleanups for those
structs are never pushed to the cleanup stack in EmitParmDecl).
rdar://problem/39194693
Differential Revision: https://reviews.llvm.org/D45382
llvm-svn: 331020
Diffstat (limited to 'clang/test/CodeGenObjCXX/lambda-expressions.mm')
-rw-r--r-- | clang/test/CodeGenObjCXX/lambda-expressions.mm | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/clang/test/CodeGenObjCXX/lambda-expressions.mm b/clang/test/CodeGenObjCXX/lambda-expressions.mm index c8247e2e0a2..f60655c61b1 100644 --- a/clang/test/CodeGenObjCXX/lambda-expressions.mm +++ b/clang/test/CodeGenObjCXX/lambda-expressions.mm @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s -fexceptions -std=c++11 -fblocks -fobjc-arc | FileCheck -check-prefix=ARC %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s -fexceptions -std=c++11 -fblocks -fobjc-arc -fobjc-runtime-has-weak -DWEAK_SUPPORTED | FileCheck -check-prefix=ARC %s // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s -fexceptions -std=c++11 -fblocks | FileCheck -check-prefix=MRC %s typedef int (^fp)(); @@ -138,5 +138,31 @@ namespace BlockInLambda { } @end +// Check that the delegating invoke function doesn't destruct the Weak object +// that is passed. + +// ARC-LABEL: define internal void @"_ZZN14LambdaDelegate4testEvEN3$_58__invokeENS_4WeakE"( +// ARC: call void @"_ZZN14LambdaDelegate4testEvENK3$_5clENS_4WeakE"( +// ARC-NEXT: ret void + +// ARC-LABEL: define internal void @"_ZZN14LambdaDelegate4testEvENK3$_5clENS_4WeakE"( +// ARC: call void @_ZN14LambdaDelegate4WeakD1Ev( + +#ifdef WEAK_SUPPORTED + +namespace LambdaDelegate { + +struct Weak { + __weak id x; +}; + +void test() { + void (*p)(Weak) = [](Weak a) { }; +} + +}; + +#endif + // ARC: attributes [[NUW]] = { noinline nounwind{{.*}} } // MRC: attributes [[NUW]] = { noinline nounwind{{.*}} } |