[cfe-commits] r141946 - in /cfe/trunk: include/clang/AST/ASTContext.h lib/AST/DeclObjC.cpp lib/Sema/SemaDeclObjC.cpp test/PCH/method-redecls.m

jahanian fjahanian at apple.com
Fri Oct 14 09:56:09 PDT 2011


Don't we already have logic for finding previous declarations; say for ivars, or c++ men functions?
Can you use the same logic rather than using buffering of method decls?

- fariborz

On Oct 13, 2011, at 11:48 PM, Argyrios Kyrtzidis wrote:

> Author: akirtzidis
> Date: Fri Oct 14 01:48:06 2011
> New Revision: 141946
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=141946&view=rev
> Log:
> Keep track of objc method redeclarations in the same interface.
> 
> Avoid possible infinite loop when iterating over an ObjCMethod's redeclarations.
> 
> Added:
>    cfe/trunk/test/PCH/method-redecls.m
> Modified:
>    cfe/trunk/include/clang/AST/ASTContext.h
>    cfe/trunk/lib/AST/DeclObjC.cpp
>    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
> 
> Modified: cfe/trunk/include/clang/AST/ASTContext.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=141946&r1=141945&r2=141946&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
> +++ cfe/trunk/include/clang/AST/ASTContext.h Fri Oct 14 01:48:06 2011
> @@ -150,6 +150,10 @@
> 
>   /// \brief Mapping from ObjCContainers to their ObjCImplementations.
>   llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*> ObjCImpls;
> +  
> +  /// \brief Mapping from ObjCMethod to its duplicate declaration in the same
> +  /// interface.
> +  llvm::DenseMap<const ObjCMethodDecl*,const ObjCMethodDecl*> ObjCMethodRedecls;
> 
>   /// \brief Mapping from __block VarDecls to their copy initialization expr.
>   llvm::DenseMap<const VarDecl*, Expr*> BlockVarCopyInits;
> @@ -1585,6 +1589,21 @@
>   /// \brief Set the implementation of ObjCCategoryDecl.
>   void setObjCImplementation(ObjCCategoryDecl *CatD,
>                              ObjCCategoryImplDecl *ImplD);
> +
> +  /// \brief Get the duplicate declaration of a ObjCMethod in the same
> +  /// interface, or null if non exists.
> +  const ObjCMethodDecl *getObjCMethodRedeclaration(ObjCMethodDecl *MD) const {
> +    llvm::DenseMap<const ObjCMethodDecl*, const ObjCMethodDecl*>::const_iterator
> +      I = ObjCMethodRedecls.find(MD);
> +    if (I == ObjCMethodRedecls.end())
> +      return 0;
> +    return I->second;
> +  }
> +
> +  void setObjCMethodRedeclaration(const ObjCMethodDecl *MD,
> +                                  const ObjCMethodDecl *Redecl) {
> +    ObjCMethodRedecls[MD] = Redecl;
> +  }
> 
>   /// \brief Set the copy inialization expression of a block var decl.
>   void setBlockVarCopyInits(VarDecl*VD, Expr* Init);
> 
> Modified: cfe/trunk/lib/AST/DeclObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=141946&r1=141945&r2=141946&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclObjC.cpp (original)
> +++ cfe/trunk/lib/AST/DeclObjC.cpp Fri Oct 14 01:48:06 2011
> @@ -392,7 +392,11 @@
> /// Otherwise it will return itself.
> ObjCMethodDecl *ObjCMethodDecl::getNextRedeclaration() {
>   ASTContext &Ctx = getASTContext();
> -  ObjCMethodDecl *Redecl = 0;
> +  ObjCMethodDecl *Redecl =
> +      const_cast<ObjCMethodDecl*>(Ctx.getObjCMethodRedeclaration(this));
> +  if (Redecl)
> +    return Redecl;
> +
>   Decl *CtxD = cast<Decl>(getDeclContext());
> 
>   if (ObjCInterfaceDecl *IFD = dyn_cast<ObjCInterfaceDecl>(CtxD)) {
> 
> Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=141946&r1=141945&r2=141946&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Fri Oct 14 01:48:06 2011
> @@ -2167,6 +2167,8 @@
>           Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
>         Method->setInvalidDecl();
>       } else {
> +        if (PrevMethod)
> +          Context.setObjCMethodRedeclaration(PrevMethod, Method);
>         InsMap[Method->getSelector()] = Method;
>         /// The following allows us to typecheck messages to "id".
>         AddInstanceMethodToGlobalPool(Method);
> @@ -2186,6 +2188,8 @@
>         Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
>         Method->setInvalidDecl();
>       } else {
> +        if (PrevMethod)
> +          Context.setObjCMethodRedeclaration(PrevMethod, Method);
>         ClsMap[Method->getSelector()] = Method;
>         /// The following allows us to typecheck messages to "Class".
>         AddFactoryMethodToGlobalPool(Method);
> 
> Added: cfe/trunk/test/PCH/method-redecls.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/method-redecls.m?rev=141946&view=auto
> ==============================================================================
> --- cfe/trunk/test/PCH/method-redecls.m (added)
> +++ cfe/trunk/test/PCH/method-redecls.m Fri Oct 14 01:48:06 2011
> @@ -0,0 +1,13 @@
> +// RUN: %clang_cc1 -x objective-c -emit-pch -o %t
> +
> +// Avoid infinite loop because of method redeclarations.
> +
> + at interface Foo
> +-(void)meth;
> +-(void)meth;
> +-(void)meth;
> + at end
> +
> + at implementation Foo
> +-(void)meth { }
> + at end
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list