summaryrefslogtreecommitdiffstats
path: root/clang/lib/ARCMigrate/Transforms.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-11-04 23:43:03 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-11-04 23:43:03 +0000
commit6b2d47d8299ffd74c4418936da2322ce988340f5 (patch)
tree03f5ef2b90816eccb0076519ab5a3621e4d3fa8b /clang/lib/ARCMigrate/Transforms.cpp
parentb0a48e1dd808fb95d46cc3f80089ea3b08a49ed6 (diff)
downloadbcm5719-llvm-6b2d47d8299ffd74c4418936da2322ce988340f5.tar.gz
bcm5719-llvm-6b2d47d8299ffd74c4418936da2322ce988340f5.zip
[arcmt] In GC, error out when there is a call that returns a pointer to
GC managed non-objc object memory. llvm-svn: 143747
Diffstat (limited to 'clang/lib/ARCMigrate/Transforms.cpp')
-rw-r--r--clang/lib/ARCMigrate/Transforms.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/ARCMigrate/Transforms.cpp b/clang/lib/ARCMigrate/Transforms.cpp
index 0decdd6b43b..d0c9bc69c85 100644
--- a/clang/lib/ARCMigrate/Transforms.cpp
+++ b/clang/lib/ARCMigrate/Transforms.cpp
@@ -324,6 +324,26 @@ MigrationContext::~MigrationContext() {
delete *I;
}
+bool MigrationContext::isGCOwnedNonObjC(QualType T) {
+ while (!T.isNull()) {
+ if (const AttributedType *AttrT = T->getAs<AttributedType>()) {
+ if (AttrT->getAttrKind() == AttributedType::attr_objc_ownership)
+ return !AttrT->getModifiedType()->isObjCRetainableType();
+ }
+
+ if (T->isArrayType())
+ T = Pass.Ctx.getBaseElementType(T);
+ else if (const PointerType *PT = T->getAs<PointerType>())
+ T = PT->getPointeeType();
+ else if (const ReferenceType *RT = T->getAs<ReferenceType>())
+ T = RT->getPointeeType();
+ else
+ break;
+ }
+
+ return false;
+}
+
void MigrationContext::traverse(TranslationUnitDecl *TU) {
ASTTransform(*this).TraverseDecl(TU);
}
OpenPOWER on IntegriCloud