[cfe-commits] r95571 - in /cfe/trunk: lib/AST/ASTContext.cpp test/SemaObjC/gc-attr-block-ivar.m test/SemaObjC/objc2-merge-gc-attribue-decl.m
Fariborz Jahanian
fjahanian at apple.com
Mon Feb 8 13:09:39 PST 2010
Author: fjahanian
Date: Mon Feb 8 15:09:39 2010
New Revision: 95571
URL: http://llvm.org/viewvc/llvm-project?rev=95571&view=rev
Log:
Merge block/function pointer types with objc's __weak
attribute properly and avoid bogus warning. This is
an objective-c fix only. objective-c++ follows different code
pass and requires separate fix (which will come at a later time).
Fixes radar 7214820.
Added:
cfe/trunk/test/SemaObjC/gc-attr-block-ivar.m
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/test/SemaObjC/objc2-merge-gc-attribue-decl.m
Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=95571&r1=95570&r2=95571&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Mon Feb 8 15:09:39 2010
@@ -4303,11 +4303,24 @@
bool allRTypes = true;
// Check return type
- QualType retType = mergeTypes(lbase->getResultType(), rbase->getResultType());
+ QualType LRES = lbase->getResultType();
+ QualType RRES = rbase->getResultType();
+ Qualifiers::GC GC_L = LRES.getObjCGCAttr();
+ Qualifiers::GC GC_R = RRES.getObjCGCAttr();
+ // __weak/__strong attribute on one function/block return type but
+ // not the other is OK.
+ if (GC_L != GC_R) {
+ if (GC_R == Qualifiers::GCNone)
+ RRES = getObjCGCQualType(RRES, GC_L);
+ else if (GC_L == Qualifiers::GCNone)
+ LRES = getObjCGCQualType(LRES, GC_R);
+ }
+
+ QualType retType = mergeTypes(LRES, RRES);
if (retType.isNull()) return QualType();
- if (getCanonicalType(retType) != getCanonicalType(lbase->getResultType()))
+ if (getCanonicalType(retType) != getCanonicalType(LRES))
allLTypes = false;
- if (getCanonicalType(retType) != getCanonicalType(rbase->getResultType()))
+ if (getCanonicalType(retType) != getCanonicalType(RRES))
allRTypes = false;
// FIXME: double check this
bool NoReturn = lbase->getNoReturnAttr() || rbase->getNoReturnAttr();
Added: cfe/trunk/test/SemaObjC/gc-attr-block-ivar.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/gc-attr-block-ivar.m?rev=95571&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjC/gc-attr-block-ivar.m (added)
+++ cfe/trunk/test/SemaObjC/gc-attr-block-ivar.m Mon Feb 8 15:09:39 2010
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -fblocks -fobjc-gc %s
+
+ at interface Intf {
+ at public
+ void (^block) (id);
+ __weak void (^weak_block) (id);
+ void (*fptr) (id);
+ __weak void (*weak_fptr) (id);
+}
+ at end
+
+int main() {
+ Intf *observer;
+ return (observer->block != observer->weak_block ||
+ observer->fptr != observer->weak_fptr);
+}
+
Modified: cfe/trunk/test/SemaObjC/objc2-merge-gc-attribue-decl.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/objc2-merge-gc-attribue-decl.m?rev=95571&r1=95570&r2=95571&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/objc2-merge-gc-attribue-decl.m (original)
+++ cfe/trunk/test/SemaObjC/objc2-merge-gc-attribue-decl.m Mon Feb 8 15:09:39 2010
@@ -10,8 +10,8 @@
extern id CFRunLoopGetMain();
extern __strong id CFRunLoopGetMain();
-extern __weak id WLoopGetMain(); // expected-note {{previous declaration is here}}
-extern id WLoopGetMain(); // expected-error {{conflicting types for 'WLoopGetMain'}}
+extern __weak id WLoopGetMain();
+extern id WLoopGetMain();
extern id p3; // expected-note {{previous definition is here}}
extern __weak id p3; // expected-error {{redefinition of 'p3' with a different type}}
More information about the cfe-commits
mailing list