summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-02-13 19:06:18 +0000
committerDouglas Gregor <dgregor@apple.com>2009-02-13 19:06:18 +0000
commit4feb36de047de72703acd18000387b11aeee4d26 (patch)
tree2f82a42bd16756edd70e5ef96b90b00f48262509
parent9319db8a1131909bd668ab2f5d38b5ff6465b1ef (diff)
downloadbcm5719-llvm-4feb36de047de72703acd18000387b11aeee4d26.tar.gz
bcm5719-llvm-4feb36de047de72703acd18000387b11aeee4d26.zip
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. llvm-svn: 64474
-rw-r--r--clang/include/clang/AST/DeclGroup.h27
-rw-r--r--clang/include/clang/AST/Stmt.h4
-rw-r--r--clang/lib/AST/CFG.cpp7
-rw-r--r--clang/lib/AST/DeclGroup.cpp51
-rw-r--r--clang/lib/AST/Stmt.cpp1
-rw-r--r--clang/lib/AST/StmtSerialization.cpp3
-rw-r--r--clang/lib/Sema/SemaStmt.cpp4
7 files changed, 10 insertions, 87 deletions
diff --git a/clang/include/clang/AST/DeclGroup.h b/clang/include/clang/AST/DeclGroup.h
index 3f7a60a3034..2b93f3c2cb3 100644
--- a/clang/include/clang/AST/DeclGroup.h
+++ b/clang/include/clang/AST/DeclGroup.h
@@ -53,7 +53,7 @@ public:
void Emit(llvm::Serializer& S) const;
/// Read - Deserialize a DeclGroup from Bitcode.
- static DeclGroup* Create(llvm::Deserializer& D, ASTContext& C);
+ static DeclGroup* Read(llvm::Deserializer& D, ASTContext& C);
};
class DeclGroupRef {
@@ -110,30 +110,5 @@ public:
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
#endif
diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h
index ae7596a1063..66eb303c9d7 100644
--- a/clang/include/clang/AST/Stmt.h
+++ b/clang/include/clang/AST/Stmt.h
@@ -226,10 +226,10 @@ public:
///
class DeclStmt : public Stmt {
protected:
- DeclGroupOwningRef DG;
+ DeclGroupRef DG;
SourceLocation StartLoc, EndLoc;
public:
- DeclStmt(DeclGroupOwningRef& dg, SourceLocation startLoc,
+ DeclStmt(DeclGroupRef dg, SourceLocation startLoc,
SourceLocation endLoc) : Stmt(DeclStmtClass), DG(dg),
StartLoc(startLoc), EndLoc(endLoc) {}
diff --git a/clang/lib/AST/CFG.cpp b/clang/lib/AST/CFG.cpp
index 2ea83882876..e08a00b8a5e 100644
--- a/clang/lib/AST/CFG.cpp
+++ b/clang/lib/AST/CFG.cpp
@@ -379,11 +379,8 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt = false) {
? 8 : llvm::AlignOf<DeclStmt>::Alignment;
// 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;
void* Mem = cfg->getAllocator().Allocate(sizeof(DeclStmt), A);
diff --git a/clang/lib/AST/DeclGroup.cpp b/clang/lib/AST/DeclGroup.cpp
index e7f84e1f46c..35cb6d3bc61 100644
--- a/clang/lib/AST/DeclGroup.cpp
+++ b/clang/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.
-DeclGroup* DeclGroup::Create(llvm::Deserializer& D, ASTContext& C) {
+DeclGroup* DeclGroup::Read(llvm::Deserializer& D, ASTContext& C) {
unsigned NumDecls = (unsigned) D.ReadInt();
unsigned size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls;
unsigned alignment = llvm::AlignOf<DeclGroup>::Alignment;
@@ -54,32 +54,10 @@ DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) : NumDecls(numdecls) {
}
void DeclGroup::Destroy(ASTContext& C) {
- Decl** Decls = (Decl**) (this + 1);
-
- for (unsigned i = 0; i < NumDecls; ++i)
- Decls[i]->Destroy(C);
-
this->~DeclGroup();
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 {
if (getKind() == DeclKind) {
S.EmitBool(false);
@@ -98,28 +76,3 @@ DeclGroupRef DeclGroupRef::ReadVal(llvm::Deserializer& D) {
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;
-}
diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp
index 49c8c80509a..b85a67e689f 100644
--- a/clang/lib/AST/Stmt.cpp
+++ b/clang/lib/AST/Stmt.cpp
@@ -58,7 +58,6 @@ void Stmt::Destroy(ASTContext& C) {
}
void DeclStmt::Destroy(ASTContext& C) {
- DG.Destroy(C);
this->~DeclStmt();
C.Deallocate((void *)this);
}
diff --git a/clang/lib/AST/StmtSerialization.cpp b/clang/lib/AST/StmtSerialization.cpp
index 5a6e49cb3e3..22ce8183fd6 100644
--- a/clang/lib/AST/StmtSerialization.cpp
+++ b/clang/lib/AST/StmtSerialization.cpp
@@ -550,8 +550,7 @@ void DeclStmt::EmitImpl(Serializer& S) const {
DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) {
SourceLocation StartLoc = 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 {
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index dd505f69673..bfa1c5e6d05 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -58,11 +58,11 @@ Sema::OwningStmtResult Sema::ActOnDeclStmt(DeclTy *decl,
assert (!decls.empty());
if (decls.size() == 1) {
- DeclGroupOwningRef DG(*decls.begin());
+ DeclGroupRef DG(*decls.begin());
return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
}
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));
}
}
OpenPOWER on IntegriCloud