]> granicus.if.org Git - clang/commitdiff
Addressed the issue in <rdar://problem/6479085>, where we failed to
authorDouglas Gregor <dgregor@apple.com>
Fri, 9 Jan 2009 00:49:46 +0000 (00:49 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 9 Jan 2009 00:49:46 +0000 (00:49 +0000)
rewrite @class declarations that showed up within linkage
specifications because those @class declarations never made it any
place where the rewriter could find them.

Moved all of the ObjC*Decl nodes over to ScopedDecls, so that they can
live in the appropriate top-level or transparent DeclContext near the
top level, e.g., TranslationUnitDecl or LinkageSpecDecl. Objective-C
declarations now show up in a traversal of the declarations in a
DeclContext (they didn't before!). This way, the rewriter finds all
Objective-C declarations within linkage specifications.

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

Driver/RewriteObjC.cpp
include/clang/AST/Decl.h
include/clang/AST/DeclBase.h
include/clang/AST/DeclObjC.h
lib/AST/DeclObjC.cpp
lib/Sema/Sema.cpp
lib/Sema/SemaDeclObjC.cpp

index 614c30996ebce638450be78a877c64b99650f85c..b20bbb349ee373618b26c422be3d8e3ca99a5d87 100644 (file)
@@ -580,6 +580,12 @@ void RewriteObjC::HandleTopLevelDecl(Decl *D) {
   } else if (ObjCForwardProtocolDecl *FP = 
              dyn_cast<ObjCForwardProtocolDecl>(D)){
     RewriteForwardProtocolDecl(FP);
+  } else if (LinkageSpecDecl *LSD = dyn_cast<LinkageSpecDecl>(D)) {
+    // Recurse into linkage specifications
+    for (DeclContext::decl_iterator DI = LSD->decls_begin(),
+                                 DIEnd = LSD->decls_end();
+         DI != DIEnd; ++DI)
+      HandleTopLevelDecl(*DI);
   }
   // If we have a decl in the main file, see if we should rewrite it.
   if (SM->isFromMainFile(Loc))
@@ -4367,14 +4373,6 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
 /// HandleDeclInMainFile - This is called for each top-level decl defined in the
 /// main file of the input.
 void RewriteObjC::HandleDeclInMainFile(Decl *D) {
-  // Required when rewriting in objective-c++ mode...
-  if (LinkageSpecDecl *LSD = dyn_cast<LinkageSpecDecl>(D)) {
-    for (LinkageSpecDecl::decl_iterator i = LSD->decls_begin(), 
-                                        e = LSD->decls_end(); i != e; ++i) {
-      HandleDeclInMainFile(*i);
-    }
-    return;
-  }
   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
     if (FD->isOverloadedOperator())
       return;
index 5623fe981ac7d2af63d8e0be077db8dc3001d0d4..fd21933f4ff93302ad57ded028fc778998b24c34 100644 (file)
@@ -143,7 +143,7 @@ class ScopedDecl : public NamedDecl {
 
 protected:
   ScopedDecl(Kind DK, DeclContext *DC, SourceLocation L,
-             DeclarationName N, ScopedDecl *PrevDecl)
+             DeclarationName N, ScopedDecl *PrevDecl = 0)
     : NamedDecl(DK, L, N), NextDeclarator(PrevDecl),
       DeclCtx(reinterpret_cast<uintptr_t>(DC)) {}
 
index 689ae69c63b39603cf9b4b97c610e9e947694ba8..000caca87132a514ce4835f9db1f8a505ab8f135 100644 (file)
@@ -53,14 +53,7 @@ public:
     // Decl
          TranslationUnit,  // [DeclContext]
     //   NamedDecl
-    //     ObjCContainerDecl // [DeclContext]
-             ObjCCategory,
-             ObjCProtocol,
-             ObjCInterface,
            OverloadedFunction,
-           ObjCCategoryImpl,  // [DeclContext]
-           ObjCImplementation, // [DeclContext]
-           ObjCProperty,
     //     ScopedDecl
              Field,
                ObjCIvar,
@@ -88,18 +81,25 @@ public:
                 NonTypeTemplateParm,
              LinkageSpec, // [DeclContext]
              ObjCMethod,  // [DeclContext]
-           ObjCCompatibleAlias,
-           ObjCClass,
-           ObjCForwardProtocol,
-           ObjCPropertyImpl,
+    //       ObjCContainerDecl // [DeclContext]
+               ObjCCategory,
+               ObjCProtocol,
+               ObjCInterface,
+             ObjCCategoryImpl,  // [DeclContext]
+             ObjCImplementation, // [DeclContext]
+             ObjCProperty,
+             ObjCCompatibleAlias,
+             ObjCClass,
+             ObjCForwardProtocol,
+             ObjCPropertyImpl,
          FileScopeAsm,
             Block, // [DeclContext]
   
     // For each non-leaf class, we now define a mapping to the first/last member
     // of the class, to allow efficient classof.
-    NamedFirst     = OverloadedFunction , NamedLast     = NonTypeTemplateParm,
+    NamedFirst     = OverloadedFunction , NamedLast     = ObjCPropertyImpl,
     FieldFirst     = Field        , FieldLast     = ObjCAtDefsField,
-    ScopedFirst    = Field        , ScopedLast    = ObjCMethod,
+    ScopedFirst    = Field        , ScopedLast    = ObjCPropertyImpl,
     TypeFirst      = Typedef      , TypeLast      = TemplateTypeParm,
     TagFirst       = Enum         , TagLast       = CXXRecord,
     RecordFirst    = Record       , RecordLast    = CXXRecord,
index 7835cec557c96085547154e5db36a1f05e775807..75719312281ddc55caedcef361168279878298c0 100644 (file)
@@ -254,12 +254,13 @@ public:
 /// If DeclContext ends up providing some support for creating more strongly 
 /// typed iterators, the code below should be reduced considerably.
 ///
-class ObjCContainerDecl : public NamedDecl, public DeclContext {
+class ObjCContainerDecl : public ScopedDecl, public DeclContext {
   SourceLocation AtEndLoc; // marks the end of the method container.
 public:
 
-  ObjCContainerDecl(Kind DK, SourceLocation L, IdentifierInfo *Id)
-    : NamedDecl(DK, L, Id), DeclContext(DK) {}
+  ObjCContainerDecl(Kind DK, DeclContext *DC, SourceLocation L, 
+                    IdentifierInfo *Id)
+    : ScopedDecl(DK, DC, L, Id), DeclContext(DK) {}
 
   virtual ~ObjCContainerDecl();
     
@@ -479,9 +480,9 @@ class ObjCInterfaceDecl : public ObjCContainerDecl {
   SourceLocation SuperClassLoc; // location of the super class identifier.
   SourceLocation EndLoc; // marks the '>', '}', or identifier.
 
-  ObjCInterfaceDecl(SourceLocation atLoc, IdentifierInfo *Id,
+  ObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id,
                     SourceLocation CLoc, bool FD, bool isInternal)
-    : ObjCContainerDecl(ObjCInterface, atLoc, Id),
+    : ObjCContainerDecl(ObjCInterface, DC, atLoc, Id),
       TypeForDecl(0), SuperClass(0),
       Ivars(0), NumIvars(0),
       CategoryList(0), PropertyDecl(0), NumPropertyDecl(0),
@@ -496,7 +497,7 @@ public:
   /// Destroy - Call destructors and release memory.
   virtual void Destroy(ASTContext& C);
 
-  static ObjCInterfaceDecl *Create(ASTContext &C,
+  static ObjCInterfaceDecl *Create(ASTContext &C, DeclContext *DC,
                                    SourceLocation atLoc,
                                    IdentifierInfo *Id, 
                                    SourceLocation ClassLoc = SourceLocation(),
@@ -713,8 +714,8 @@ class ObjCProtocolDecl : public ObjCContainerDecl {
   SourceLocation EndLoc; // marks the '>' or identifier.
   SourceLocation AtEndLoc; // marks the end of the entire interface.
   
-  ObjCProtocolDecl(SourceLocation L, IdentifierInfo *Id)
-    : ObjCContainerDecl(ObjCProtocol, L, Id), 
+  ObjCProtocolDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id)
+    : ObjCContainerDecl(ObjCProtocol, DC, L, Id), 
       PropertyDecl(0), NumPropertyDecl(0),
       isForwardProtoDecl(true) {
   }
@@ -726,8 +727,8 @@ public:
   /// Destroy - Call destructors and release memory.
   virtual void Destroy(ASTContext& C);
   
-  static ObjCProtocolDecl *Create(ASTContext &C, SourceLocation L,
-                                  IdentifierInfo *Id);
+  static ObjCProtocolDecl *Create(ASTContext &C, DeclContext *DC, 
+                                  SourceLocation L, IdentifierInfo *Id);
 
   const ObjCList<ObjCProtocolDecl> &getReferencedProtocols() const { 
     return ReferencedProtocols;
@@ -784,12 +785,14 @@ public:
 ///
 /// @class NSCursor, NSImage, NSPasteboard, NSWindow;
 ///
-class ObjCClassDecl : public Decl {
+/// FIXME: This could be a transparent DeclContext (!)
+class ObjCClassDecl : public ScopedDecl {
   ObjCInterfaceDecl **ForwardDecls;
   unsigned NumForwardDecls;
   
-  ObjCClassDecl(SourceLocation L, ObjCInterfaceDecl **Elts, unsigned nElts)
-    : Decl(ObjCClass, L) { 
+  ObjCClassDecl(DeclContext *DC, SourceLocation L, 
+                ObjCInterfaceDecl **Elts, unsigned nElts)
+    : ScopedDecl(ObjCClass, DC, L, DeclarationName()) { 
     if (nElts) {
       ForwardDecls = new ObjCInterfaceDecl*[nElts];
       memcpy(ForwardDecls, Elts, nElts*sizeof(ObjCInterfaceDecl*));
@@ -806,7 +809,7 @@ public:
   /// Destroy - Call destructors and release memory.
   virtual void Destroy(ASTContext& C);
   
-  static ObjCClassDecl *Create(ASTContext &C, SourceLocation L,
+  static ObjCClassDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L,
                                ObjCInterfaceDecl **Elts, unsigned nElts);
   
   void setInterfaceDecl(unsigned idx, ObjCInterfaceDecl *OID) {
@@ -829,13 +832,14 @@ public:
 /// 
 /// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
 /// 
-class ObjCForwardProtocolDecl : public Decl {
+/// FIXME: Should this be a transparent DeclContext?
+class ObjCForwardProtocolDecl : public ScopedDecl {
   ObjCProtocolDecl **ReferencedProtocols;
   unsigned NumReferencedProtocols;
   
-  ObjCForwardProtocolDecl(SourceLocation L,
+  ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L,
                           ObjCProtocolDecl **Elts, unsigned nElts)
-  : Decl(ObjCForwardProtocol, L) { 
+    : ScopedDecl(ObjCForwardProtocol, DC, L, DeclarationName()) { 
     NumReferencedProtocols = nElts;
     if (nElts) {
       ReferencedProtocols = new ObjCProtocolDecl*[nElts];
@@ -848,7 +852,8 @@ class ObjCForwardProtocolDecl : public Decl {
   virtual ~ObjCForwardProtocolDecl();
   
 public:
-  static ObjCForwardProtocolDecl *Create(ASTContext &C, SourceLocation L, 
+  static ObjCForwardProtocolDecl *Create(ASTContext &C, DeclContext *DC,
+                                         SourceLocation L, 
                                          ObjCProtocolDecl **Elts, unsigned Num);
 
   
@@ -911,14 +916,14 @@ class ObjCCategoryDecl : public ObjCContainerDecl {
   
   SourceLocation EndLoc; // marks the '>' or identifier.
   
-  ObjCCategoryDecl(SourceLocation L, IdentifierInfo *Id)
-    : ObjCContainerDecl(ObjCCategory, L, Id),
+  ObjCCategoryDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id)
+    : ObjCContainerDecl(ObjCCategory, DC, L, Id),
       ClassInterface(0),
       NextClassCategory(0), PropertyDecl(0),  NumPropertyDecl(0) {
   }
 public:
   
-  static ObjCCategoryDecl *Create(ASTContext &C,
+  static ObjCCategoryDecl *Create(ASTContext &C, DeclContext *DC,
                                   SourceLocation L, IdentifierInfo *Id);
   
   ObjCInterfaceDecl *getClassInterface() { return ClassInterface; }
@@ -987,7 +992,7 @@ public:
 ///  @dynamic p1,d1;
 /// @end
 ///
-class ObjCCategoryImplDecl : public NamedDecl, public DeclContext {
+class ObjCCategoryImplDecl : public ScopedDecl, public DeclContext {
   /// Class interface for this category implementation
   ObjCInterfaceDecl *ClassInterface;
 
@@ -1002,12 +1007,12 @@ class ObjCCategoryImplDecl : public NamedDecl, public DeclContext {
 
   SourceLocation EndLoc;  
 
-  ObjCCategoryImplDecl(SourceLocation L, IdentifierInfo *Id,
+  ObjCCategoryImplDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
                        ObjCInterfaceDecl *classInterface)
-    : NamedDecl(ObjCCategoryImpl, L, Id), DeclContext(ObjCCategoryImpl),
+    : ScopedDecl(ObjCCategoryImpl, DC, L, Id), DeclContext(ObjCCategoryImpl),
       ClassInterface(classInterface) {}
 public:
-  static ObjCCategoryImplDecl *Create(ASTContext &C,
+  static ObjCCategoryImplDecl *Create(ASTContext &C, DeclContext *DC,
                                       SourceLocation L, IdentifierInfo *Id,
                                       ObjCInterfaceDecl *classInterface);
         
@@ -1090,7 +1095,7 @@ public:
 /// the legacy semantics and allow developers to move private ivar declarations
 /// from the class interface to the class implementation (but I digress:-)
 ///
-class ObjCImplementationDecl : public NamedDecl, public DeclContext {
+class ObjCImplementationDecl : public ScopedDecl, public DeclContext {
   /// Class interface for this implementation
   ObjCInterfaceDecl *ClassInterface;
   
@@ -1112,14 +1117,14 @@ class ObjCImplementationDecl : public NamedDecl, public DeclContext {
   
   SourceLocation EndLoc;
 
-  ObjCImplementationDecl(SourceLocation L, IdentifierInfo *Id,
+  ObjCImplementationDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
                          ObjCInterfaceDecl *classInterface,
                          ObjCInterfaceDecl *superDecl)
-    : NamedDecl(ObjCImplementation, L, Id), DeclContext(ObjCImplementation),
+    : ScopedDecl(ObjCImplementation, DC, L, Id), DeclContext(ObjCImplementation),
       ClassInterface(classInterface), SuperClass(superDecl),
       Ivars(0), NumIvars(0) {}
 public:  
-  static ObjCImplementationDecl *Create(ASTContext &C,
+  static ObjCImplementationDecl *Create(ASTContext &C, DeclContext *DC, 
                                         SourceLocation L, IdentifierInfo *Id,
                                         ObjCInterfaceDecl *classInterface,
                                         ObjCInterfaceDecl *superDecl);
@@ -1205,15 +1210,15 @@ public:
 
 /// ObjCCompatibleAliasDecl - Represents alias of a class. This alias is 
 /// declared as @compatibility_alias alias class.
-class ObjCCompatibleAliasDecl : public NamedDecl {
+class ObjCCompatibleAliasDecl : public ScopedDecl {
   /// Class that this is an alias of.
   ObjCInterfaceDecl *AliasedClass;
   
-  ObjCCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id,
+  ObjCCompatibleAliasDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
                           ObjCInterfaceDecl* aliasedClass)
-    : NamedDecl(ObjCCompatibleAlias, L, Id), AliasedClass(aliasedClass) {}
+    : ScopedDecl(ObjCCompatibleAlias, DC, L, Id), AliasedClass(aliasedClass) {}
 public:
-  static ObjCCompatibleAliasDecl *Create(ASTContext &C,
+  static ObjCCompatibleAliasDecl *Create(ASTContext &C, DeclContext *DC,
                                          SourceLocation L, IdentifierInfo *Id,
                                          ObjCInterfaceDecl* aliasedClass);
 
@@ -1231,7 +1236,7 @@ public:
 /// For example:
 /// @property (assign, readwrite) int MyProperty;
 ///
-class ObjCPropertyDecl : public NamedDecl {
+class ObjCPropertyDecl : public ScopedDecl {
 public:
   enum PropertyAttributeKind {
     OBJC_PR_noattr    = 0x00, 
@@ -1260,14 +1265,16 @@ private:
   ObjCMethodDecl *GetterMethodDecl; // Declaration of getter instance method
   ObjCMethodDecl *SetterMethodDecl; // Declaration of setter instance method
 
-  ObjCPropertyDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
-    : NamedDecl(ObjCProperty, L, Id), DeclType(T),
+  ObjCPropertyDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id, 
+                   QualType T)
+    : ScopedDecl(ObjCProperty, DC, L, Id), DeclType(T),
       PropertyAttributes(OBJC_PR_noattr), PropertyImplementation(None),
       GetterName(Selector()), 
       SetterName(Selector()),
       GetterMethodDecl(0), SetterMethodDecl(0) {}
 public:
-  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, 
+  static ObjCPropertyDecl *Create(ASTContext &C, DeclContext *DC, 
+                                  SourceLocation L, 
                                   IdentifierInfo *Id, QualType T,
                                   PropertyControl propControl = None);
   QualType getType() const { return DeclType; }
@@ -1332,7 +1339,7 @@ public:
 /// in a class or category implementation block. For example:
 /// @synthesize prop1 = ivar1;
 ///
-class ObjCPropertyImplDecl : public Decl {
+class ObjCPropertyImplDecl : public ScopedDecl {
 public:
   enum Kind {
     Synthesize,
@@ -1346,18 +1353,18 @@ private:
   /// Null for @dynamic. Required for @synthesize.
   ObjCIvarDecl *PropertyIvarDecl;
 
-  ObjCPropertyImplDecl(SourceLocation atLoc, SourceLocation L,
+  ObjCPropertyImplDecl(DeclContext *DC, SourceLocation atLoc, SourceLocation L,
                        ObjCPropertyDecl *property, 
                        Kind PK, 
                        ObjCIvarDecl *ivarDecl)
-    : Decl(ObjCPropertyImpl, L), AtLoc(atLoc), PropertyDecl(property), 
-      PropertyIvarDecl(ivarDecl) {
+    : ScopedDecl(ObjCPropertyImpl, DC, L, DeclarationName()), AtLoc(atLoc), 
+      PropertyDecl(property), PropertyIvarDecl(ivarDecl) {
     assert (PK == Dynamic || PropertyIvarDecl);
   }
   
 public:
-  static ObjCPropertyImplDecl *Create(ASTContext &C, SourceLocation atLoc, 
-                                      SourceLocation L, 
+  static ObjCPropertyImplDecl *Create(ASTContext &C, DeclContext *DC,
+                                      SourceLocation atLoc, SourceLocation L, 
                                       ObjCPropertyDecl *property, 
                                       Kind PK, 
                                       ObjCIvarDecl *ivarDecl);
index b7c0cf79b94ceade9c80484a2d9c3059efaa9759..194544f9fa81a0f0693cff6a77eed0cda14d8755 100644 (file)
@@ -51,12 +51,13 @@ void ObjCMethodDecl::Destroy(ASTContext& C) {
 }
 
 ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,
+                                             DeclContext *DC,
                                              SourceLocation atLoc,
                                              IdentifierInfo *Id, 
                                              SourceLocation ClassLoc,
                                              bool ForwardDecl, bool isInternal){
   void *Mem = C.getAllocator().Allocate<ObjCInterfaceDecl>();
-  return new (Mem) ObjCInterfaceDecl(atLoc, Id, ClassLoc, ForwardDecl,
+  return new (Mem) ObjCInterfaceDecl(DC, atLoc, Id, ClassLoc, ForwardDecl,
                                      isInternal);
 }
 
@@ -104,11 +105,11 @@ void ObjCAtDefsFieldDecl::Destroy(ASTContext& C) {
   C.getAllocator().Deallocate((void *)this); 
 }
 
-ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C,
+ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC,
                                            SourceLocation L, 
                                            IdentifierInfo *Id) {
   void *Mem = C.getAllocator().Allocate<ObjCProtocolDecl>();
-  return new (Mem) ObjCProtocolDecl(L, Id);
+  return new (Mem) ObjCProtocolDecl(DC, L, Id);
 }
 
 ObjCProtocolDecl::~ObjCProtocolDecl() {
@@ -130,11 +131,11 @@ void ObjCProtocolDecl::Destroy(ASTContext& C) {
 }
 
 
-ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C,
+ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC,
                                      SourceLocation L,
                                      ObjCInterfaceDecl **Elts, unsigned nElts) {
   void *Mem = C.getAllocator().Allocate<ObjCClassDecl>();
-  return new (Mem) ObjCClassDecl(L, Elts, nElts);
+  return new (Mem) ObjCClassDecl(DC, L, Elts, nElts);
 }
 
 ObjCClassDecl::~ObjCClassDecl() {
@@ -155,58 +156,58 @@ void ObjCClassDecl::Destroy(ASTContext& C) {
 }
 
 ObjCForwardProtocolDecl *
-ObjCForwardProtocolDecl::Create(ASTContext &C,
+ObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC,
                                 SourceLocation L, 
                                 ObjCProtocolDecl **Elts, unsigned NumElts) {
   void *Mem = C.getAllocator().Allocate<ObjCForwardProtocolDecl>();
-  return new (Mem) ObjCForwardProtocolDecl(L, Elts, NumElts);
+  return new (Mem) ObjCForwardProtocolDecl(DC, L, Elts, NumElts);
 }
 
 ObjCForwardProtocolDecl::~ObjCForwardProtocolDecl() {
   delete [] ReferencedProtocols;
 }
 
-ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C,
+ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC,
                                            SourceLocation L,
                                            IdentifierInfo *Id) {
   void *Mem = C.getAllocator().Allocate<ObjCCategoryDecl>();
-  return new (Mem) ObjCCategoryDecl(L, Id);
+  return new (Mem) ObjCCategoryDecl(DC, L, Id);
 }
 
 ObjCCategoryImplDecl *
-ObjCCategoryImplDecl::Create(ASTContext &C,
+ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC,
                              SourceLocation L,IdentifierInfo *Id,
                              ObjCInterfaceDecl *ClassInterface) {
   void *Mem = C.getAllocator().Allocate<ObjCCategoryImplDecl>();
-  return new (Mem) ObjCCategoryImplDecl(L, Id, ClassInterface);
+  return new (Mem) ObjCCategoryImplDecl(DC, L, Id, ClassInterface);
 }
 
 ObjCImplementationDecl *
-ObjCImplementationDecl::Create(ASTContext &C,
+ObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC, 
                                SourceLocation L,
                                IdentifierInfo *Id,
                                ObjCInterfaceDecl *ClassInterface,
                                ObjCInterfaceDecl *SuperDecl) {
   void *Mem = C.getAllocator().Allocate<ObjCImplementationDecl>();
-  return new (Mem) ObjCImplementationDecl(L, Id, ClassInterface, SuperDecl);
+  return new (Mem) ObjCImplementationDecl(DC, L, Id, ClassInterface, SuperDecl);
 }
 
 ObjCCompatibleAliasDecl *
-ObjCCompatibleAliasDecl::Create(ASTContext &C,
+ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC,
                                 SourceLocation L,
                                 IdentifierInfo *Id, 
                                 ObjCInterfaceDecl* AliasedClass) {
   void *Mem = C.getAllocator().Allocate<ObjCCompatibleAliasDecl>();
-  return new (Mem) ObjCCompatibleAliasDecl(L, Id, AliasedClass);
+  return new (Mem) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass);
 }
 
-ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C,
+ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC,
                                            SourceLocation L,
                                            IdentifierInfo *Id,
                                            QualType T,
                                            PropertyControl propControl) {
   void *Mem = C.getAllocator().Allocate<ObjCPropertyDecl>();
-  return new (Mem) ObjCPropertyDecl(L, Id, T);
+  return new (Mem) ObjCPropertyDecl(DC, L, Id, T);
 }
 
 //===----------------------------------------------------------------------===//
@@ -757,13 +758,14 @@ ObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() {
 }
 
 ObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C,
+                                                   DeclContext *DC,
                                                    SourceLocation atLoc,
                                                    SourceLocation L,
                                                    ObjCPropertyDecl *property,
                                                    Kind PK,
                                                    ObjCIvarDecl *ivar) {
   void *Mem = C.getAllocator().Allocate<ObjCPropertyImplDecl>();
-  return new (Mem) ObjCPropertyImplDecl(atLoc, L, property, PK, ivar);
+  return new (Mem) ObjCPropertyImplDecl(DC, atLoc, L, property, PK, ivar);
 }
 
 
index 41285c4e6761e409264a2db7d5ee311b66d6f956..33f146aad8d2ea17570813622815fc16da18ebea 100644 (file)
@@ -94,7 +94,7 @@ void Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) {
   Context.setObjCClassType(ClassTypedef);
   // Synthesize "@class Protocol;
   ObjCInterfaceDecl *ProtocolDecl =
-    ObjCInterfaceDecl::Create(Context, SourceLocation(),
+    ObjCInterfaceDecl::Create(Context, CurContext, SourceLocation(),
                               &Context.Idents.get("Protocol"), 
                               SourceLocation(), true);
   Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl));
index 3dfcb3a801244e6fa7933ca501db7bf5459274c8..5f191a2f3cbfcc5f8254d6f00ec3b347be652bb5 100644 (file)
@@ -93,12 +93,14 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
       IDecl->setForwardDecl(false);
     }
   } else {
-    IDecl = ObjCInterfaceDecl::Create(Context, AtInterfaceLoc, 
+    IDecl = ObjCInterfaceDecl::Create(Context, CurContext, AtInterfaceLoc, 
                                       ClassName, ClassLoc);
     if (AttrList)
       ProcessDeclAttributeList(IDecl, AttrList);
   
     ObjCInterfaceDecls[ClassName] = IDecl;
+    // FIXME: PushOnScopeChains
+    CurContext->addDecl(Context, IDecl);
     // Remember that this needs to be removed when the scope is popped.
     TUScope->AddDecl(IDecl);
   }
@@ -178,13 +180,15 @@ Sema::DeclTy *Sema::ActOnCompatiblityAlias(SourceLocation AtLoc,
   
   // Everything checked out, instantiate a new alias declaration AST.
   ObjCCompatibleAliasDecl *AliasDecl = 
-    ObjCCompatibleAliasDecl::Create(Context, AtLoc, AliasName, CDecl);
+    ObjCCompatibleAliasDecl::Create(Context, CurContext, AtLoc, AliasName, CDecl);
   
   ObjCAliasDecls[AliasName] = AliasDecl;
-  
+
+  // FIXME: PushOnScopeChains?
+  CurContext->addDecl(Context, AliasDecl);
   if (!CheckObjCDeclScope(AliasDecl))
     TUScope->AddDecl(AliasDecl);
-  
+
   return AliasDecl;
 }
 
@@ -212,7 +216,10 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc,
     PDecl->setLocation(AtProtoInterfaceLoc);
     PDecl->setForwardDecl(false);
   } else {
-    PDecl = ObjCProtocolDecl::Create(Context, AtProtoInterfaceLoc,ProtocolName);
+    PDecl = ObjCProtocolDecl::Create(Context, CurContext, 
+                                     AtProtoInterfaceLoc,ProtocolName);
+    // FIXME: PushOnScopeChains?
+    CurContext->addDecl(Context, PDecl);
     PDecl->setForwardDecl(false);
     ObjCProtocols[ProtocolName] = PDecl;
   }
@@ -442,17 +449,21 @@ Sema::ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc,
   for (unsigned i = 0; i != NumElts; ++i) {
     IdentifierInfo *Ident = IdentList[i].first;
     ObjCProtocolDecl *&PDecl = ObjCProtocols[Ident];
-    if (PDecl == 0) // Not already seen?
-      PDecl = ObjCProtocolDecl::Create(Context, IdentList[i].second, Ident);
+    if (PDecl == 0) { // Not already seen?
+      PDecl = ObjCProtocolDecl::Create(Context, CurContext, 
+                                       IdentList[i].second, Ident);
+      // FIXME: PushOnScopeChains?
+      CurContext->addDecl(Context, PDecl);
+    }
     if (attrList)
       ProcessDeclAttributeList(PDecl, attrList);
     Protocols.push_back(PDecl);
   }
   
   ObjCForwardProtocolDecl *PDecl = 
-    ObjCForwardProtocolDecl::Create(Context, AtProtocolLoc,
+    ObjCForwardProtocolDecl::Create(Context, CurContext, AtProtocolLoc,
                                     &Protocols[0], Protocols.size());
-  
+  CurContext->addDecl(Context, PDecl);
   CheckObjCDeclScope(PDecl);
   return PDecl;
 }
@@ -468,7 +479,9 @@ ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc,
   ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName);
   
   ObjCCategoryDecl *CDecl = 
-    ObjCCategoryDecl::Create(Context, AtInterfaceLoc, CategoryName);
+    ObjCCategoryDecl::Create(Context, CurContext, AtInterfaceLoc, CategoryName);
+  // FIXME: PushOnScopeChains?
+  CurContext->addDecl(Context, CDecl);
   CDecl->setClassInterface(IDecl);
   
   /// Check that class of this category is already completely declared.
@@ -508,11 +521,15 @@ Sema::DeclTy *Sema::ActOnStartCategoryImplementation(
                       IdentifierInfo *CatName, SourceLocation CatLoc) {
   ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName);
   ObjCCategoryImplDecl *CDecl = 
-    ObjCCategoryImplDecl::Create(Context, AtCatImplLoc, CatName, IDecl);
+    ObjCCategoryImplDecl::Create(Context, CurContext, AtCatImplLoc, CatName,
+                                 IDecl);
   /// Check that class of this category is already completely declared.
   if (!IDecl || IDecl->isForwardDecl())
     Diag(ClassLoc, diag::err_undef_interface) << ClassName;
 
+  // FIXME: PushOnScopeChains?
+  CurContext->addDecl(Context, CDecl);
+
   /// TODO: Check that CatName, category name, is not used in another
   // implementation.
   ObjCCategoryImpls.push_back(CDecl);
@@ -570,20 +587,25 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation(
 
     // FIXME: Do we support attributes on the @implementation? If so
     // we should copy them over.
-    IDecl = ObjCInterfaceDecl::Create(Context, AtClassImplLoc, ClassName
-                                      ClassLoc, false, true);
+    IDecl = ObjCInterfaceDecl::Create(Context, CurContext, AtClassImplLoc
+                                      ClassName, ClassLoc, false, true);
     ObjCInterfaceDecls[ClassName] = IDecl;
     IDecl->setSuperClass(SDecl);
     IDecl->setLocEnd(ClassLoc);
     
+    // FIXME: PushOnScopeChains?
+    CurContext->addDecl(Context, IDecl);
     // Remember that this needs to be removed when the scope is popped.
     TUScope->AddDecl(IDecl);
   }
   
   ObjCImplementationDecl* IMPDecl = 
-    ObjCImplementationDecl::Create(Context, AtClassImplLoc, ClassName
-                                   IDecl, SDecl);
+    ObjCImplementationDecl::Create(Context, CurContext, AtClassImplLoc
+                                   ClassName, IDecl, SDecl);
   
+  // FIXME: PushOnScopeChains?
+  CurContext->addDecl(Context, IMPDecl);
+
   if (CheckObjCDeclScope(IMPDecl))
     return IMPDecl;
   
@@ -875,10 +897,12 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
     }
     ObjCInterfaceDecl *IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl); 
     if (!IDecl) {  // Not already seen?  Make a forward decl.
-      IDecl = ObjCInterfaceDecl::Create(Context, AtClassLoc, IdentList[i],
-                                        SourceLocation(), true);
+      IDecl = ObjCInterfaceDecl::Create(Context, CurContext, AtClassLoc, 
+                                        IdentList[i], SourceLocation(), true);
       ObjCInterfaceDecls[IdentList[i]] = IDecl;
 
+      // FIXME: PushOnScopeChains?
+      CurContext->addDecl(Context, IDecl);
       // Remember that this needs to be removed when the scope is popped.
       TUScope->AddDecl(IDecl);
     }
@@ -886,10 +910,10 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
     Interfaces.push_back(IDecl);
   }
   
-  ObjCClassDecl *CDecl = ObjCClassDecl::Create(Context, AtClassLoc,
+  ObjCClassDecl *CDecl = ObjCClassDecl::Create(Context, CurContext, AtClassLoc,
                                                &Interfaces[0],
                                                Interfaces.size());
-  
+  CurContext->addDecl(Context, CDecl);
   CheckObjCDeclScope(CDecl);
   return CDecl;  
 }
@@ -1527,8 +1551,11 @@ Sema::DeclTy *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
   if (t->isArrayType() || t->isFunctionType())
     Diag(AtLoc, diag::err_property_type) << T;
   
-  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc, 
+  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, CurContext, AtLoc, 
                                                      FD.D.getIdentifier(), T);
+  // FIXME: PushOnScopeChains?
+  CurContext->addDecl(Context, PDecl);
+
   // Regardless of setter/getter attribute, we save the default getter/setter
   // selector names in anticipation of declaration of setter/getter methods.
   PDecl->setGetterName(GetterSel);
@@ -1661,11 +1688,13 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc,
   }
   assert (property && "ActOnPropertyImplDecl - property declaration missing");
   ObjCPropertyImplDecl *PIDecl = 
-    ObjCPropertyImplDecl::Create(Context, AtLoc, PropertyLoc, property, 
+    ObjCPropertyImplDecl::Create(Context, CurContext, AtLoc, PropertyLoc, 
+                                 property, 
                                  (Synthesize ? 
                                   ObjCPropertyImplDecl::Synthesize 
                                   : ObjCPropertyImplDecl::Dynamic),
                                  Ivar);
+  CurContext->addDecl(Context, PIDecl);
   if (IC) {
     if (Synthesize)
       if (ObjCPropertyImplDecl *PPIDecl =