diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-11-19 01:23:07 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-11-19 01:23:07 +0000 |
commit | 509f31efd027ffb2ba5a4f927bde8f07a8f081a9 (patch) | |
tree | 1d3cf55ee4e70f8060e0f00625c625cef1c7bbf6 /clang/lib/Sema | |
parent | d12ccbd3434135bf4dce0d3bd9d0ac1943b20183 (diff) | |
download | bcm5719-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.cpp | 27 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 6 |
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 { |