From: Fariborz Jahanian Date: Fri, 30 Sep 2011 20:50:23 +0000 (+0000) Subject: objc arc: allow objc_returns_inner_pointer on methods that return X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f2e5945e3a989e9d981c03c4a9cbbfb6232c8c07;p=clang objc arc: allow objc_returns_inner_pointer on methods that return a reference type, since inner reference is much like an inner pointer. // rdar://10139365 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140880 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 0ffb92f00f..5802aaad96 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -3250,7 +3250,9 @@ static void handleObjCReturnsInnerPointerAttr(Sema &S, Decl *D, // Check that the method returns a normal pointer. QualType resultType = method->getResultType(); - if (!resultType->isPointerType() || resultType->isObjCRetainableType()) { + + if (!resultType->isReferenceType() && + (!resultType->isPointerType() || resultType->isObjCRetainableType())) { S.Diag(method->getLocStart(), diag::warn_ns_attribute_wrong_return_type) << SourceRange(loc) << attr.getName() << /*method*/ 1 << /*non-retainable pointer*/ 2; diff --git a/test/CodeGenObjCXX/arc-returns-inner-reference-ptr.mm b/test/CodeGenObjCXX/arc-returns-inner-reference-ptr.mm new file mode 100644 index 0000000000..06c83d8e70 --- /dev/null +++ b/test/CodeGenObjCXX/arc-returns-inner-reference-ptr.mm @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-nonfragile-abi -fobjc-arc -o - %s | FileCheck %s +// rdar://10139365 + +@interface Test58 +- (char* &) interior __attribute__((objc_returns_inner_pointer)); +- (int&)reference_to_interior_int __attribute__((objc_returns_inner_pointer)); +@end + +void foo() { + Test58 *ptr; + char *c = [(ptr) interior]; + + int i = [(ptr) reference_to_interior_int]; +} + +// CHECK: [[T0:%.*]] = load {{%.*}} {{%.*}}, align 8 +// CHECK: [[T1:%.*]] = bitcast {{%.*}} [[T0]] to i8* +// call i8* @objc_retainAutorelease(i8* [[T1]]) nounwind +// CHECK: [[T2:%.*]] = load {{%.*}} {{%.*}}, align 8 +// CHECK: [[T3:%.*]] = bitcast {{%.*}} [[T2]] to i8* +// call i8* @objc_retainAutorelease(i8* [[T3]]) nounwind +