Bind cleanups after doing l2r conversion on the operand of a

@throw expression;  l2r conversion can introduce new cleanups
in certain cases, like when the expression is an ObjC property
reference of retainable type in ARC.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156425 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
John McCall 2012-05-08 21:41:25 +00:00
Родитель 6a2a1865f8
Коммит d1376ee094
2 изменённых файлов: 11 добавлений и 5 удалений

Просмотреть файл

@ -2677,15 +2677,13 @@ Sema::ActOnObjCAtTryStmt(SourceLocation AtLoc, Stmt *Try,
Finally)); Finally));
} }
StmtResult Sema::BuildObjCAtThrowStmt(SourceLocation AtLoc, StmtResult Sema::BuildObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw) {
Expr *Throw) {
if (Throw) { if (Throw) {
Throw = MaybeCreateExprWithCleanups(Throw);
ExprResult Result = DefaultLvalueConversion(Throw); ExprResult Result = DefaultLvalueConversion(Throw);
if (Result.isInvalid()) if (Result.isInvalid())
return StmtError(); return StmtError();
Throw = Result.take(); Throw = MaybeCreateExprWithCleanups(Result.take());
QualType ThrowType = Throw->getType(); QualType ThrowType = Throw->getType();
// Make sure the expression type is an ObjC pointer or "void *". // Make sure the expression type is an ObjC pointer or "void *".
if (!ThrowType->isDependentType() && if (!ThrowType->isDependentType() &&

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -fblocks -verify -Wno-objc-root-class %s // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -fblocks -fobjc-exceptions -verify -Wno-objc-root-class %s
// rdar://9309489 // rdar://9309489
@interface MyClass { @interface MyClass {
@ -55,3 +55,11 @@
@implementation Test2 @implementation Test2
@synthesize test2; @synthesize test2;
@end @end
// rdar://problem/11144407
@interface Test3
@property (strong) id exception;
@end
void test3(Test3 *t3) {
@throw t3.exception;
}