diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2008-05-07 20:53:44 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-05-07 20:53:44 +0000 |
commit | 4607034e621aa77378ec75249d1e9eaf5de49b6a (patch) | |
tree | 1acb4071a03e10be1872c5c058cf27b2a2bed5bb | |
parent | 0fcbf8ef89ffed19a6b50b28bff756f1324204fe (diff) |
Synthesized getter/setter method declarations need not have
an implementation. This fixes couple of failing prperty tests
caused by my previous patch.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50830 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/DeclObjC.h | 8 | ||||
-rw-r--r-- | lib/AST/DeclObjC.cpp | 5 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 3 |
3 files changed, 13 insertions, 3 deletions
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 9079445f3a..1255c17925 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -59,6 +59,9 @@ private: bool IsInstance : 1; bool IsVariadic : 1; + // Synthesized declaration method for a property setter/getter + bool IsSynthesized : 1; + // NOTE: VC++ treats enums as signed, avoid using ImplementationControl enum /// @required/@optional unsigned DeclImplementation : 2; @@ -95,10 +98,12 @@ private: Decl *contextDecl, AttributeList *M = 0, bool isInstance = true, bool isVariadic = false, + bool isSynthesized = false, ImplementationControl impControl = None) : Decl(ObjCMethod, beginLoc), DeclContext(ObjCMethod), IsInstance(isInstance), IsVariadic(isVariadic), + IsSynthesized(isSynthesized), DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None), MethodContext(static_cast<NamedDecl*>(contextDecl)), SelName(SelInfo), MethodDeclType(T), @@ -113,6 +118,7 @@ public: QualType T, Decl *contextDecl, AttributeList *M = 0, bool isInstance = true, bool isVariadic = false, + bool isSynthesized = false, ImplementationControl impControl = None); ObjCDeclQualifier getObjCDeclQualifier() const { @@ -158,6 +164,8 @@ public: bool isInstance() const { return IsInstance; } bool isVariadic() const { return IsVariadic; } + bool isSynthesized() const { return IsSynthesized; } + // Related to protocols declared in @protocol void setDeclImplementation(ImplementationControl ic) { DeclImplementation = ic; diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 3c89a6aa7d..cda73d2ff9 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -26,12 +26,13 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, Decl *contextDecl, AttributeList *M, bool isInstance, bool isVariadic, + bool isSynthesized, ImplementationControl impControl) { void *Mem = C.getAllocator().Allocate<ObjCMethodDecl>(); return new (Mem) ObjCMethodDecl(beginLoc, endLoc, SelInfo, T, contextDecl, M, isInstance, - isVariadic, impControl); + isVariadic, isSynthesized, impControl); } ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, @@ -294,7 +295,7 @@ void ObjCInterfaceDecl::addPropertyMethods( property->getLocation(), property->getGetterName(), resultDeclType, this, 0, - true, false, ObjCMethodDecl::Required); + true, false, true, ObjCMethodDecl::Required); property->setGetterMethodDecl(ObjCMethod); insMethods.push_back(ObjCMethod); } diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 96710cc20c..a0fa6ecb2b 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -636,7 +636,7 @@ void Sema::ImplMethodsVsClassMethods(ObjCImplementationDecl* IMPDecl, bool IncompleteImpl = false; for (ObjCInterfaceDecl::instmeth_iterator I = IDecl->instmeth_begin(), E = IDecl->instmeth_end(); I != E; ++I) - if (!InsMap.count((*I)->getSelector())) + if (!(*I)->isSynthesized() && !InsMap.count((*I)->getSelector())) WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl); llvm::DenseSet<Selector> ClsMap; @@ -964,6 +964,7 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( ObjCMethodDecl::Create(Context, MethodLoc, EndLoc, Sel, resultDeclType, ClassDecl, AttrList, MethodType == tok::minus, isVariadic, + false, MethodDeclKind == tok::objc_optional ? ObjCMethodDecl::Optional : ObjCMethodDecl::Required); |