From b5e0224173058c6fd5272d86bf251628c38b2513 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 24 Apr 2008 19:58:34 +0000 Subject: [PATCH] Patch to diagnose inconsistancies between properties declared in current and its super class. This patch is incomplete. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50228 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Parse/Action.h | 10 ++++-- lib/Sema/Sema.h | 3 ++ lib/Sema/SemaDeclObjC.cpp | 68 ++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index de25ece901..75d06e3b92 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -718,8 +718,14 @@ public: llvm::SmallVector & Protocols) { } - - + + /// ComparePropertiesInBaseAndSuper - This routine compares property + /// declarations in base and its super class, if any, and issues + /// diagnostics in a variety of inconsistant situations. + /// + virtual void ComparePropertiesInBaseAndSuper(SourceLocation *PropertyLoc, + DeclTy *ClassInterface) { + } //===----------------------- Obj-C Expressions --------------------------===// virtual ExprResult ParseObjCStringLiteral(SourceLocation *AtLocs, diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index da878f3f13..4b6722abc6 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -652,6 +652,9 @@ public: llvm::SmallVector & Protocols); + virtual void ComparePropertiesInBaseAndSuper(SourceLocation *PropertyLoc, + DeclTy *ClassInterface); + virtual void ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl, DeclTy **allMethods = 0, unsigned allNum = 0, DeclTy **allProperties = 0, unsigned pNum = 0); diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 61449fc457..63c1350743 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -246,6 +246,74 @@ Sema::FindProtocolDeclaration(SourceLocation TypeLoc, } } +/// DiagnosePropertyMismatch - Compares two properties for their +/// attributes and types and warns on a variety of inconsistancies. +/// +// TODO: Incomplete. +// +static void +DiagnosePropertyMismatch(ObjCPropertyDecl *Property, + ObjCPropertyDecl *SuperProperty) { + ObjCPropertyDecl::PropertyAttributeKind CAttr = + Property->getPropertyAttributes(); + ObjCPropertyDecl::PropertyAttributeKind SAttr = + SuperProperty->getPropertyAttributes(); + if ((CAttr & ObjCPropertyDecl::OBJC_PR_readonly) + && (SAttr & ObjCPropertyDecl::OBJC_PR_readwrite)) + ; // ??? + + if ((CAttr & ObjCPropertyDecl::OBJC_PR_copy) + != (SAttr & ObjCPropertyDecl::OBJC_PR_copy)) + ; // + else if ((CAttr & ObjCPropertyDecl::OBJC_PR_retain) + != (SAttr & ObjCPropertyDecl::OBJC_PR_retain)) + ; // ??? + + if ((CAttr & ObjCPropertyDecl::OBJC_PR_nonatomic) + != (SAttr & ObjCPropertyDecl::OBJC_PR_nonatomic)) + ; // + + if (Property->getSetterName() != SuperProperty->getSetterName()) + ; // + if (Property->getGetterName() != SuperProperty->getGetterName()) + ; // + + if (Property->getCanonicalType() != SuperProperty->getCanonicalType()) { + if ((CAttr & ObjCPropertyDecl::OBJC_PR_readonly) + && (SAttr & ObjCPropertyDecl::OBJC_PR_readonly)) + // && objc_compare_types(...)) + ; + else + ; // + } + +} + +/// ComparePropertiesInBaseAndSuper - This routine compares property +/// declarations in base and its super class, if any, and issues +/// diagnostics in a variety of inconsistant situations. +/// +void +Sema::ComparePropertiesInBaseAndSuper(SourceLocation *PropertyLoc, + DeclTy *D) { + ObjCInterfaceDecl *IDecl = + dyn_cast(static_cast(D)); + ObjCInterfaceDecl *SDecl = IDecl->getSuperClass(); + if (!SDecl) + return; + for (ObjCInterfaceDecl::classprop_iterator I = SDecl->classprop_begin(), + E = SDecl->classprop_end(); I != E; ++I) { + ObjCPropertyDecl *SuperPDecl = (*I); + // Does property in super class has declaration in current class? + for (ObjCInterfaceDecl::classprop_iterator I = IDecl->classprop_begin(), + E = IDecl->classprop_end(); I != E; ++I) { + ObjCPropertyDecl *PDecl = (*I); + if (SuperPDecl->getIdentifier() == PDecl->getIdentifier()) + DiagnosePropertyMismatch(PDecl, SuperPDecl); + } + } +} + /// ActOnForwardProtocolDeclaration - Action::DeclTy * Sema::ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc,