瀏覽代碼

Remove DeclGroupOwningRef, since we intend for declarations to be owned
by DeclContexts (always) rather than by statements.

DeclContext currently goes out of its way to avoid destroying any
Decls that might be owned by a DeclGroupOwningRef. However, in an
error-recovery situation, a failure in a declaration statement can
cause all of the decls in a DeclGroupOwningRef to be destroyed after
they've already be added into the DeclContext. Hence, DeclContext is
left with already-destroyed declarations, and bad things happen. This
problem was causing failures that showed up as assertions on x86 Linux
in test/Parser/objc-forcollection-neg-2.m.



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

Douglas Gregor 16 年之前
父節點
當前提交
9653db7bd0
共有 7 個文件被更改,包括 10 次插入87 次删除
  1. 1 26
      include/clang/AST/DeclGroup.h
  2. 2 2
      include/clang/AST/Stmt.h
  3. 2 5
      lib/AST/CFG.cpp
  4. 2 49
      lib/AST/DeclGroup.cpp
  5. 0 1
      lib/AST/Stmt.cpp
  6. 1 2
      lib/AST/StmtSerialization.cpp
  7. 2 2
      lib/Sema/SemaStmt.cpp

+ 1 - 26
include/clang/AST/DeclGroup.h

@@ -53,7 +53,7 @@ public:
   void Emit(llvm::Serializer& S) const;
   void Emit(llvm::Serializer& S) const;
   
   
   /// Read - Deserialize a DeclGroup from Bitcode.
   /// Read - Deserialize a DeclGroup from Bitcode.
-  static DeclGroup* Create(llvm::Deserializer& D, ASTContext& C);
+  static DeclGroup* Read(llvm::Deserializer& D, ASTContext& C);
 };
 };
     
     
 class DeclGroupRef {
 class DeclGroupRef {
@@ -110,30 +110,5 @@ public:
   static DeclGroupRef ReadVal(llvm::Deserializer& D);
   static DeclGroupRef ReadVal(llvm::Deserializer& D);
 };
 };
   
   
-class DeclGroupOwningRef : public DeclGroupRef {
-public:
-  explicit DeclGroupOwningRef() : DeclGroupRef((Decl*)0) {}
-  explicit DeclGroupOwningRef(Decl* d) : DeclGroupRef(d) {}
-  explicit DeclGroupOwningRef(DeclGroup* dg) : DeclGroupRef(dg) {}
-
-  ~DeclGroupOwningRef();  
-  void Destroy(ASTContext& C);
-  
-  DeclGroupOwningRef(DeclGroupOwningRef& R)
-    : DeclGroupRef(R) { R.D = 0; }
-  
-  DeclGroupOwningRef& operator=(DeclGroupOwningRef& R) {
-    D = R.D;
-    R.D = 0;
-    return *this;
-  }
-  
-  /// Emit - Serialize a DeclGroupOwningRef to Bitcode.
-  void Emit(llvm::Serializer& S) const;
-  
-  /// Read - Deserialize a DeclGroupOwningRef from Bitcode.
-  DeclGroupOwningRef& Read(llvm::Deserializer& D, ASTContext& C);
-};
-
 } // end clang namespace
 } // end clang namespace
 #endif
 #endif

+ 2 - 2
include/clang/AST/Stmt.h

@@ -226,10 +226,10 @@ public:
 ///
 ///
 class DeclStmt : public Stmt {
 class DeclStmt : public Stmt {
 protected:
 protected:
-  DeclGroupOwningRef DG;
+  DeclGroupRef DG;
   SourceLocation StartLoc, EndLoc;
   SourceLocation StartLoc, EndLoc;
 public:
 public:
-  DeclStmt(DeclGroupOwningRef& dg, SourceLocation startLoc, 
+  DeclStmt(DeclGroupRef dg, SourceLocation startLoc, 
            SourceLocation endLoc) : Stmt(DeclStmtClass), DG(dg),
            SourceLocation endLoc) : Stmt(DeclStmtClass), DG(dg),
                                     StartLoc(startLoc), EndLoc(endLoc) {}
                                     StartLoc(startLoc), EndLoc(endLoc) {}
   
   

+ 2 - 5
lib/AST/CFG.cpp

@@ -379,11 +379,8 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt = false) {
                        ? 8 : llvm::AlignOf<DeclStmt>::Alignment;
                        ? 8 : llvm::AlignOf<DeclStmt>::Alignment;
           
           
           // Allocate the DeclStmt using the BumpPtrAllocator.  It will
           // Allocate the DeclStmt using the BumpPtrAllocator.  It will
-          // get automatically freed with the CFG.  Note that even though
-          // we are using a DeclGroupOwningRef that wraps a singe Decl*,
-          // that Decl* will not get deallocated because the destroy method
-          // of DG is never called.
-          DeclGroupOwningRef DG(*I);
+          // get automatically freed with the CFG. 
+          DeclGroupRef DG(*I);
           Decl* D = *I;
           Decl* D = *I;
           void* Mem = cfg->getAllocator().Allocate(sizeof(DeclStmt), A);
           void* Mem = cfg->getAllocator().Allocate(sizeof(DeclStmt), A);
           
           

+ 2 - 49
lib/AST/DeclGroup.cpp

@@ -7,7 +7,7 @@
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
-//  This file defines the DeclGroup, DeclGroupRef, and OwningDeclGroup classes.
+//  This file defines the DeclGroup and DeclGroupRef classes.
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 
 
@@ -36,7 +36,7 @@ void DeclGroup::Emit(llvm::Serializer& S) const {
 }
 }
 
 
 /// Read - Deserialize a DeclGroup from Bitcode.
 /// Read - Deserialize a DeclGroup from Bitcode.
-DeclGroup* DeclGroup::Create(llvm::Deserializer& D, ASTContext& C) {
+DeclGroup* DeclGroup::Read(llvm::Deserializer& D, ASTContext& C) {
   unsigned NumDecls = (unsigned) D.ReadInt();
   unsigned NumDecls = (unsigned) D.ReadInt();
   unsigned size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls;
   unsigned size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls;
   unsigned alignment = llvm::AlignOf<DeclGroup>::Alignment;  
   unsigned alignment = llvm::AlignOf<DeclGroup>::Alignment;  
@@ -54,32 +54,10 @@ DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) : NumDecls(numdecls) {
 }
 }
 
 
 void DeclGroup::Destroy(ASTContext& C) {
 void DeclGroup::Destroy(ASTContext& C) {
-  Decl** Decls = (Decl**) (this + 1);
-  
-  for (unsigned i = 0; i < NumDecls; ++i)
-    Decls[i]->Destroy(C);
-  
   this->~DeclGroup();
   this->~DeclGroup();
   C.Deallocate((void*) this);
   C.Deallocate((void*) this);
 }
 }
 
 
-DeclGroupOwningRef::~DeclGroupOwningRef() {
-  assert (D == 0 && "Destroy method not called.");
-}
-
-void DeclGroupOwningRef::Destroy(ASTContext& C) {
-  if (!D)
-    return;
-  
-  if (getKind() == DeclKind)
-    D->Destroy(C);
-  else    
-    reinterpret_cast<DeclGroup*>(reinterpret_cast<uintptr_t>(D) &
-                                 ~Mask)->Destroy(C);
-  
-  D = 0;
-}
-
 void DeclGroupRef::Emit(llvm::Serializer& S) const {
 void DeclGroupRef::Emit(llvm::Serializer& S) const {
   if (getKind() == DeclKind) {
   if (getKind() == DeclKind) {
     S.EmitBool(false);
     S.EmitBool(false);
@@ -98,28 +76,3 @@ DeclGroupRef DeclGroupRef::ReadVal(llvm::Deserializer& D) {
   
   
   return DeclGroupRef(D.ReadPtr<DeclGroup>());
   return DeclGroupRef(D.ReadPtr<DeclGroup>());
 }
 }
-
-void DeclGroupOwningRef::Emit(llvm::Serializer& S) const {
-  if (getKind() == DeclKind) {
-    S.EmitBool(false);
-    S.EmitOwnedPtr(D);
-  }
-  else {
-    S.EmitBool(true);
-    S.EmitOwnedPtr(reinterpret_cast<DeclGroup*>(reinterpret_cast<uintptr_t>(D)
-                                                & ~Mask));        
-  }
-}
-
-DeclGroupOwningRef& DeclGroupOwningRef::Read(llvm::Deserializer& Dezr, 
-                                             ASTContext& C) {
-  
-  if (!Dezr.ReadBool())
-    D = Dezr.ReadOwnedPtr<Decl>(C);
-  else {
-    uintptr_t x = reinterpret_cast<uintptr_t>(Dezr.ReadOwnedPtr<DeclGroup>(C));
-    D = reinterpret_cast<Decl*>(x | DeclGroupKind);
-  }
-  
-  return *this;
-}

+ 0 - 1
lib/AST/Stmt.cpp

@@ -58,7 +58,6 @@ void Stmt::Destroy(ASTContext& C) {
 }
 }
 
 
 void DeclStmt::Destroy(ASTContext& C) {
 void DeclStmt::Destroy(ASTContext& C) {
-  DG.Destroy(C);
   this->~DeclStmt();
   this->~DeclStmt();
   C.Deallocate((void *)this);
   C.Deallocate((void *)this);
 }
 }

+ 1 - 2
lib/AST/StmtSerialization.cpp

@@ -550,8 +550,7 @@ void DeclStmt::EmitImpl(Serializer& S) const {
 DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) {
 DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) {
   SourceLocation StartLoc = SourceLocation::ReadVal(D);
   SourceLocation StartLoc = SourceLocation::ReadVal(D);
   SourceLocation EndLoc = SourceLocation::ReadVal(D); 
   SourceLocation EndLoc = SourceLocation::ReadVal(D); 
-  DeclGroupOwningRef DG;
-  return new DeclStmt(DG.Read(D, C), StartLoc, EndLoc);
+  return new DeclStmt(DeclGroupRef::ReadVal(D), StartLoc, EndLoc);
 }
 }
 
 
 void DeclRefExpr::EmitImpl(Serializer& S) const {
 void DeclRefExpr::EmitImpl(Serializer& S) const {

+ 2 - 2
lib/Sema/SemaStmt.cpp

@@ -58,11 +58,11 @@ Sema::OwningStmtResult Sema::ActOnDeclStmt(DeclTy *decl,
   assert (!decls.empty());
   assert (!decls.empty());
 
 
   if (decls.size() == 1) {
   if (decls.size() == 1) {
-    DeclGroupOwningRef DG(*decls.begin());                      
+    DeclGroupRef DG(*decls.begin());                      
     return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
     return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
   }
   }
   else {
   else {
-    DeclGroupOwningRef DG(DeclGroup::Create(Context, decls.size(), &decls[0]));
+    DeclGroupRef DG(DeclGroup::Create(Context, decls.size(), &decls[0]));
     return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
     return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
   }
   }
 }
 }