From d1376ee0945a4eba0590ae33d14bade860b08a7d Mon Sep 17 00:00:00 2001 From: John McCall Date: Tue, 8 May 2012 21:41:25 +0000 Subject: [PATCH] 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 --- lib/Sema/SemaStmt.cpp | 6 ++---- test/SemaObjC/arc-property.m | 10 +++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 77cc642b5e..2e1cc7c600 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -2677,15 +2677,13 @@ Sema::ActOnObjCAtTryStmt(SourceLocation AtLoc, Stmt *Try, Finally)); } -StmtResult Sema::BuildObjCAtThrowStmt(SourceLocation AtLoc, - Expr *Throw) { +StmtResult Sema::BuildObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw) { if (Throw) { - Throw = MaybeCreateExprWithCleanups(Throw); ExprResult Result = DefaultLvalueConversion(Throw); if (Result.isInvalid()) return StmtError(); - Throw = Result.take(); + Throw = MaybeCreateExprWithCleanups(Result.take()); QualType ThrowType = Throw->getType(); // Make sure the expression type is an ObjC pointer or "void *". if (!ThrowType->isDependentType() && diff --git a/test/SemaObjC/arc-property.m b/test/SemaObjC/arc-property.m index 2599fb9848..41d8e87239 100644 --- a/test/SemaObjC/arc-property.m +++ b/test/SemaObjC/arc-property.m @@ -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 @interface MyClass { @@ -55,3 +55,11 @@ @implementation Test2 @synthesize test2; @end + +// rdar://problem/11144407 +@interface Test3 +@property (strong) id exception; +@end +void test3(Test3 *t3) { + @throw t3.exception; +} -- 2.40.0