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
diff --git a/lib/AST/DeclGroup.cpp b/lib/AST/DeclGroup.cpp
index e7f84e1..35cb6d3 100644
--- a/lib/AST/DeclGroup.cpp
+++ b/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 @@
}
/// 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 @@
}
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 @@
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;
-}