summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-11-19 01:23:07 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-11-19 01:23:07 +0000
commit509f31efd027ffb2ba5a4f927bde8f07a8f081a9 (patch)
tree1d3cf55ee4e70f8060e0f00625c625cef1c7bbf6 /clang/lib/Sema
parentd12ccbd3434135bf4dce0d3bd9d0ac1943b20183 (diff)
downloadbcm5719-llvm-509f31efd027ffb2ba5a4f927bde8f07a8f081a9.tar.gz
bcm5719-llvm-509f31efd027ffb2ba5a4f927bde8f07a8f081a9.zip
ObjectiveC 'objc_bridging'. Assorment of improvements
per Doug/Jordan comments. // rdar://15454846. llvm-svn: 195066
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp27
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp3
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp6
3 files changed, 5 insertions, 31 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 6a5d608c7b2..1892809bced 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -10072,31 +10072,6 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
}
}
-static inline bool isTollFreeBridgeCFRefType(TypedefDecl *TD) {
- TypedefNameDecl * TDefNameDecl = TD;
- const Type *TP = TDefNameDecl->getUnderlyingType().getTypePtr();
- while (const TypedefType *TDef = dyn_cast<TypedefType>(TP)) {
- TDefNameDecl = TDef->getDecl();
- TP = TDefNameDecl->getUnderlyingType().getTypePtr();
- }
-
- StringRef TDName = TDefNameDecl->getIdentifier()->getName();
- return (TDName.startswith("CF") && TDName.endswith("Ref"));
-}
-
-/// CheckObjCBridgeAttribute - Checks that objc_bridge attribute is
-/// properly applied to a typedef of a pointer to struct/union/class
-static void CheckObjCBridgeAttribute(Sema &S, TypedefDecl *TD) {
- QualType T = TD->getUnderlyingType();
- if (!T->isPointerType())
- return;
- T = T->getPointeeType();
- if (T->isStructureType() || T->isUnionType() || T->isClassType())
- if (RecordDecl *RD = T->getAs<RecordType>()->getDecl())
- if (RD->hasAttr<ObjCBridgeAttr>() && !isTollFreeBridgeCFRefType(TD))
- S.Diag(TD->getLocStart(), diag::err_objc_bridge_not_cftype);
-}
-
TypedefDecl *Sema::ParseTypedefDecl(Scope *S, Declarator &D, QualType T,
TypeSourceInfo *TInfo) {
assert(D.getIdentifier() && "Wrong callback for declspec without declarator");
@@ -10119,8 +10094,6 @@ TypedefDecl *Sema::ParseTypedefDecl(Scope *S, Declarator &D, QualType T,
NewTD->setInvalidDecl();
return NewTD;
}
-
- CheckObjCBridgeAttribute(*this, NewTD);
if (D.getDeclSpec().isModulePrivateSpecified()) {
if (CurContext->isFunctionOrMethod())
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 77f7905302d..a1f385688e1 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -4392,7 +4392,8 @@ static void handleNSBridgedAttr(Sema &S, Scope *Sc, Decl *D,
static void handleObjCBridgeAttr(Sema &S, Scope *Sc, Decl *D,
const AttributeList &Attr) {
if (!isa<RecordDecl>(D)) {
- S.Diag(D->getLocStart(), diag::err_objc_bridge_attribute);
+ S.Diag(D->getLocStart(), diag::err_objc_bridge_attribute)
+ << S.getLangOpts().CPlusPlus;
return;
}
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index 69d7b9e07e9..a2399b7ec42 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -3199,11 +3199,11 @@ static bool CheckObjCBridgeNSCast(Sema &S, QualType castType, Expr *castExpr) {
if ((CastClass == ExprClass) || (CastClass && ExprClass->isSuperClassOf(CastClass)))
return true;
S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
- << TDNDecl->getName() << Target->getName() << CastClass->getName();
+ << T << Target->getName() << castType->getPointeeType();
return true;
} else {
S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
- << TDNDecl->getName() << Target->getName() << castType;
+ << T << Target->getName() << castType;
return true;
}
}
@@ -3243,7 +3243,7 @@ static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr) {
if ((CastClass == ExprClass) || (ExprClass && CastClass->isSuperClassOf(ExprClass)))
return true;
S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge_to_cf)
- << ExprClass->getName() << TDNDecl->getName();
+ << castExpr->getType()->getPointeeType() << T;
S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
return true;
} else {
OpenPOWER on IntegriCloud