From: Fariborz Jahanian Date: Wed, 7 May 2008 20:53:44 +0000 (+0000) Subject: Synthesized getter/setter method declarations need not have X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4607034e621aa77378ec75249d1e9eaf5de49b6a;p=clang 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 --- 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(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(); 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 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);