]> granicus.if.org Git - clang/commitdiff
Change ObjCInterfaceDecl to inherit from NamedDecl (not TypeDecl). While ObjCInterfac...
authorSteve Naroff <snaroff@apple.com>
Wed, 2 Apr 2008 18:30:49 +0000 (18:30 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 2 Apr 2008 18:30:49 +0000 (18:30 +0000)
I also finished unifying access to scope decl change by converting Sema::getObjCInterfaceDecl() to use Sema::LookupDecl(). This is much cleaner now:-)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49107 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Decl.h
include/clang/AST/DeclObjC.h
include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
lib/Sema/Sema.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclObjC.cpp
test/Sema/check-dup-objc-decls-1.m

index 1ab232943a302b56e01229a256db9477898ff9a5..3db06cc0f091a6046f7dc9e0365792f375f0eff4 100644 (file)
@@ -52,7 +52,6 @@ public:
            PropertyDecl,
     //     ScopedDecl
     //       TypeDecl
-               ObjCInterface,
                Typedef,
     //         TagDecl
                  Enum,
@@ -67,6 +66,7 @@ public:
                  BlockVar,
                  FileVar,
                  ParmVar,
+         ObjCInterface,
          ObjCCompatibleAlias,
          ObjCMethod,
          ObjCClass,
@@ -78,8 +78,8 @@ public:
     // of the class, to allow efficient classof.
     NamedFirst  = Field,         NamedLast  = ParmVar,
     FieldFirst  = Field,         FieldLast  = ObjCIvar,
-    ScopedFirst = ObjCInterface, ScopedLast = ParmVar,
-    TypeFirst   = ObjCInterface, TypeLast   = Class,
+    ScopedFirst = Typedef,       ScopedLast = ParmVar,
+    TypeFirst   = Typedef,       TypeLast   = Class,
     TagFirst    = Enum         , TagLast    = Class,
     RecordFirst = Struct       , RecordLast = Class,
     ValueFirst  = EnumConstant , ValueLast  = ParmVar,
index 595718add7e844fa63076acb700042907d19aa78..7f4a9752a502b42afbe2d5635c7ac6197e53ea01 100644 (file)
@@ -191,7 +191,11 @@ public:
 ///   Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes
 ///   typically inherit from NSObject (an exception is NSProxy).
 ///
-class ObjCInterfaceDecl : public TypeDecl {
+class ObjCInterfaceDecl : public NamedDecl {
+  /// TypeForDecl - This indicates the Type object that represents this
+  /// TypeDecl.  It is a cache maintained by ASTContext::getObjCInterfaceType
+  Type *TypeForDecl;
+  friend class ASTContext;
   
   /// Class's super class.
   ObjCInterfaceDecl *SuperClass;
@@ -227,7 +231,7 @@ class ObjCInterfaceDecl : public TypeDecl {
 
   ObjCInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos,
                     IdentifierInfo *Id, bool FD, bool isInternal)
-    : TypeDecl(ObjCInterface, atLoc, Id, 0), SuperClass(0),
+    : NamedDecl(ObjCInterface, atLoc, Id), TypeForDecl(0), SuperClass(0),
       ReferencedProtocols(0), NumReferencedProtocols(0), Ivars(0), 
       NumIvars(0),
       InstanceMethods(0), NumInstanceMethods(0), 
index 5ce21e4fdb70c9bc3311dabcc7a810bee2f921d1..1ff9a9392b2af1e591209dca73c08271ba50bf5e 100644 (file)
@@ -63,7 +63,6 @@ public:
         DISPATCH_CASE(Union,RecordDecl)     // FIXME: Refine.
         DISPATCH_CASE(Class,RecordDecl)     // FIXME: Refine. 
         DISPATCH_CASE(Enum,EnumDecl)
-        DISPATCH_CASE(ObjCInterface,ObjCInterfaceDecl)
       default:
         assert(false && "Subtype of ScopedDecl not handled.");
     }
index e98d9b59a7fb6345792ca59d2f2f2a61ea0934f0..d2ad5c5f754bd2448060fabaceed9ea4a50f9acd 100644 (file)
@@ -94,7 +94,14 @@ class Sema : public Action {
   /// with @protocol keyword, so that we can emit errors on duplicates and
   /// find the declarations when needed.
   llvm::DenseMap<IdentifierInfo*, ObjCProtocolDecl*> ObjCProtocols;
-  
+
+  /// ObjCInterfaceDecls - Keep track of all class declarations declared
+  /// with @interface, so that we can emit errors on duplicates and
+  /// find the declarations when needed. 
+  typedef llvm::DenseMap<const IdentifierInfo*, 
+                         ObjCInterfaceDecl*> ObjCInterfaceDeclsTy;
+  ObjCInterfaceDeclsTy ObjCInterfaceDecls;
+    
   /// 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
@@ -102,7 +109,7 @@ class Sema : public Action {
   typedef llvm::DenseMap<const IdentifierInfo*, 
                          ObjCCompatibleAliasDecl*> ObjCAliasTy;
   ObjCAliasTy ObjCAliasDecls;
-  
+
   // Enum values used by KnownFunctionIDs (see below).
   enum {
     id_printf,
index c5901f0b91391222b84e6b2b48ec87148b1b2e4e..c9ea54fa0e9b5260580390209814df04eed38572 100644 (file)
@@ -86,19 +86,11 @@ void Sema::ActOnPopScope(SourceLocation Loc, Scope *S) {
 
 /// 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;
-  
-  if (ObjCCompatibleAliasDecl *ADecl =
-      dyn_cast_or_null<ObjCCompatibleAliasDecl>(IDecl))
-    return ADecl->getClassInterface();
+  // The third "scope" argument is 0 since we aren't enabling lazy built-in
+  // creation from this context.
+  Decl *IDecl = LookupDecl(Id, Decl::IDNS_Ordinary, 0, false);
+  
   return dyn_cast_or_null<ObjCInterfaceDecl>(IDecl);
 }
 
@@ -130,6 +122,9 @@ Decl *Sema::LookupDecl(const IdentifierInfo *II, unsigned NSI,
       // Unlike typedef's, they can only be introduced at file-scope (and are 
       // therefore not scoped decls). They can, however, be shadowed by
       // other names in IDNS_Ordinary.
+      ObjCInterfaceDeclsTy::iterator IDI = ObjCInterfaceDecls.find(II);
+      if (IDI != ObjCInterfaceDecls.end())
+        return IDI->second;
       ObjCAliasTy::iterator I = ObjCAliasDecls.find(II);
       if (I != ObjCAliasDecls.end())
         return I->second->getClassInterface();
index 62e7c8af1e937b4702f0042abfbdf9410404d834..69a102203f4802dbee806300489e3940e1022af3 100644 (file)
@@ -101,10 +101,7 @@ Sema::DeclTy *Sema::ActOnStartClassInterface(
     IDecl = ObjCInterfaceDecl::Create(Context, AtInterfaceLoc, NumProtocols,
                                       ClassName);
   
-    // Chain & install the interface decl into the identifier.
-    IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
-    ClassName->setFETokenInfo(IDecl);
-    
+    ObjCInterfaceDecls[ClassName] = IDecl;
     // Remember that this needs to be removed when the scope is popped.
     TUScope->AddDecl(IDecl);
   }
@@ -388,8 +385,7 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation(
     // Build, chain & install the interface decl into the identifier.
     IDecl = ObjCInterfaceDecl::Create(Context, AtClassImplLoc, 0, ClassName, 
                                       false, true);
-    IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
-    ClassName->setFETokenInfo(IDecl);
+    ObjCInterfaceDecls[ClassName] = IDecl;
     IDecl->setSuperClass(SDecl);
     IDecl->setLocEnd(ClassLoc);
     
@@ -597,9 +593,7 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
     if (!IDecl) {  // Not already seen?  Make a forward decl.
       IDecl = ObjCInterfaceDecl::Create(Context, AtClassLoc, 0, IdentList[i],
                                         true);
-      // Chain & install the interface decl into the identifier.
-      IDecl->setNext(IdentList[i]->getFETokenInfo<ScopedDecl>());
-      IdentList[i]->setFETokenInfo(IDecl);
+      ObjCInterfaceDecls[IdentList[i]] = IDecl;
 
       // Remember that this needs to be removed when the scope is popped.
       TUScope->AddDecl(IDecl);
index dd48ba4796da0a54637ffd2ff24a25898bf95a0b..e3902bdcca32154bfae6c5bb3472a60a280aa1aa 100644 (file)
@@ -20,8 +20,7 @@ typedef int OBJECT; // expected-error {{previous definition is here}}
 
 typedef int Gorf;  // expected-error {{previous definition is here}}
 
-@interface Gorf @end // expected-error {{redefinition of 'Gorf' as different kind of symbol}} \
-                    // expected-error {{previous definition is here}}
+@interface Gorf @end // expected-error {{redefinition of 'Gorf' as different kind of symbol}}
 
 void Gorf() // expected-error {{redefinition of 'Gorf' as different kind of symbol}}
 {