[cfe-commits] r49058 - in /cfe/trunk: include/clang/AST/Decl.h include/clang/AST/DeclObjC.h include/clang/Basic/DiagnosticKinds.def lib/AST/Decl.cpp lib/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclObjC.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaExprObjC.cpp test/Sema/alias-test-1.m

Chris Lattner clattner at apple.com
Tue Apr 1 17:24:18 PDT 2008


On Apr 1, 2008, at 4:04 PM, Steve Naroff wrote:
> URL: http://llvm.org/viewvc/llvm-project?rev=49058&view=rev
> Log:
> Fairly large "cleaup" related to changing ObjCCompatibleAliasDecl  
> superclass (to inherit from NamedDecl, instead of ScopedDecl).
>
> - Added a DenseMap to associate an IdentifierInfo with the  
> ObjCCompatibleAliasDecl.
> - Renamed LookupScopedDecl->LookupDecl and changed it's return type  
> to Decl. Also added lookup for ObjCCompatibleAliasDecl's.
> - Removed Sema::LookupInterfaceDecl(). Converted clients to used  
> LookupDecl().
> - Some minor indentation changes.
>
> Will deal with ObjCInterfaceDecl and getObjCInterfaceDecl() in a  
> separate commit...

Nice!  Some trivial nits:

>
> +  /// ObjCAliasDecls - Keep track of all class declarations declared
> +  /// with @compatibility_alias, so that we can emit errors on  
> duplicates and
> +  /// find the declarations when needed. This construct is ancient  
> and will
> +  /// likely never be seen. Nevertheless, it is here for  
> compatibility.
> +  typedef llvm::DenseMap<IdentifierInfo*, ObjCCompatibleAliasDecl*>  
> ObjCAliasTy;

If you make the key be "const IdentifierInfo*", then you can change:

> Sema::DeclTy *Sema::isTypeName(const IdentifierInfo &II, Scope *S)  
> const {
>   Decl *IIDecl = II.getFETokenInfo<Decl>();
>   // Find first occurance of none-tagged declaration
> -  while(IIDecl && IIDecl->getIdentifierNamespace() !=  
> Decl::IDNS_Ordinary)
> +  while (IIDecl && IIDecl->getIdentifierNamespace() !=  
> Decl::IDNS_Ordinary)
>     IIDecl = cast<ScopedDecl>(IIDecl)->getNext();
> -  if (!IIDecl)
> +
> +  if (!IIDecl) {
> +    if (getLangOptions().ObjC1) {
> +      // @interface and @compatibility_alias result in new type  
> references.
> +      // Creating a class alias is *extremely* rare.
> +      ObjCAliasTy::const_iterator I =  
> ObjCAliasDecls.find((IdentifierInfo*)&II);

... this to avoid a cast.

Also, can 'isTypeName' just call LookupDecl?

> +/// getObjCInterfaceDecl - Look up a for a class declaration in the  
> scope.
> +/// return 0 if one not found.
> +/// FIXME: removed this when ObjCInterfaceDecl's aren't ScopedDecl's.
> +ObjCInterfaceDecl *Sema::getObjCInterfaceDecl(IdentifierInfo *Id) {
>   ScopedDecl *IDecl;
>   // Scan up the scope chain looking for a decl that matches this  
> identifier
>   // that is in the appropriate namespace.
> +  for (IDecl = Id->getFETokenInfo<ScopedDecl>(); IDecl;
>        IDecl = IDecl->getNext())
>     if (IDecl->getIdentifierNamespace() == Decl::IDNS_Ordinary)
>       break;

It would be nice to change this to call LookupDecl as well, just to  
have a single place that walks the scope chains.

Overall, great cleanup!

-Chris



More information about the cfe-commits mailing list