[PATCH] D45382: [CodeGen] Avoid destructing a struct type that has already been destructed by a delegated constructor
Akira Hatanaka via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 6 11:24:12 PDT 2018
ahatanak created this revision.
ahatanak added reviewers: rjmccall, rsmith.
Herald added a subscriber: kristof.beyls.
This patch fixes a bug where a struct with an ObjC `__weak` field gets destructed after it has already been destructed. This bug was introduced in r328731, which made changes to the ABI that caused structs with ObjC pointer fields to be destructed in the callee in some cases.
This happens in two cases:
1. C++11 inheriting constructors.
2. When EmitConstructorBody does complete->base constructor delegation optimization.
I fixed the first case by making changes to canEmitDelegateCallArgs so that it returns false when the constructor has a parameter that is destructed in the callee.
For the second case, I made changes so that EmitParmDecl doesn't push the destructor cleanup for the struct parameter if the function is a constructor that is going to delegate to the base constructor. Alternatively, I think it's possible to just disable the optimization in EmitConstructorBody if canEmitDelegateCallArgs returns false.
rdar://problem/39194693
Repository:
rC Clang
https://reviews.llvm.org/D45382
Files:
lib/CodeGen/CGClass.cpp
lib/CodeGen/CGDecl.cpp
lib/CodeGen/CodeGenFunction.cpp
lib/CodeGen/CodeGenFunction.h
test/CodeGenObjCXX/arc-special-member-functions.mm
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D45382.141380.patch
Type: text/x-patch
Size: 5608 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180406/a469062e/attachment.bin>
More information about the cfe-commits
mailing list