diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Stmt.cpp | 16 | ||||
-rw-r--r-- | lib/Frontend/PCHReaderStmt.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 8 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 3 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 31 |
5 files changed, 37 insertions, 25 deletions
diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 668f7ef57f..a0ef5a6428 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -43,7 +43,7 @@ static StmtClassNameTable &getStmtInfoTableEntry(Stmt::StmtClass E) { } const char *Stmt::getStmtClassName() const { - return getStmtInfoTableEntry(sClass).Name; + return getStmtInfoTableEntry((StmtClass)sClass).Name; } void Stmt::DestroyChildren(ASTContext &C) { @@ -104,6 +104,20 @@ BreakStmt* BreakStmt::Clone(ASTContext &C) const { return new (C) BreakStmt(BreakLoc); } +void SwitchStmt::DoDestroy(ASTContext &Ctx) { + // Destroy the SwitchCase statements in this switch. In the normal + // case, this loop will merely decrement the reference counts from + // the Retain() calls in addSwitchCase(); + SwitchCase *SC = FirstCase; + while (SC) { + SwitchCase *Next = SC->getNextSwitchCase(); + SC->Destroy(Ctx); + SC = Next; + } + + Stmt::DoDestroy(Ctx); +} + void CompoundStmt::setStmts(ASTContext &C, Stmt **Stmts, unsigned NumStmts) { if (this->Body) C.Deallocate(Body); diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp index 6b97e610f5..3040a52260 100644 --- a/lib/Frontend/PCHReaderStmt.cpp +++ b/lib/Frontend/PCHReaderStmt.cpp @@ -194,6 +194,10 @@ unsigned PCHStmtReader::VisitSwitchStmt(SwitchStmt *S) { PrevSC->setNextSwitchCase(SC); else S->setSwitchCaseList(SC); + + // Retain this SwitchCase, since SwitchStmt::addSwitchCase() would + // normally retain it (but we aren't calling addSwitchCase). + SC->Retain(); PrevSC = SC; } return 2; diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 6094e6dae0..295607b739 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -2821,14 +2821,6 @@ public: NamedDecl *InstantiateCurrentDeclRef(NamedDecl *D); - // Simple function for cloning expressions. - template<typename T> - OwningExprResult Clone(T *E) { - assert(!E->isValueDependent() && !E->isTypeDependent() && - "expression is value or type dependent!"); - return Owned(E->Clone(Context)); - } - // Objective-C declarations. virtual DeclPtrTy ActOnStartClassInterface(SourceLocation AtInterfaceLoc, IdentifierInfo *ClassName, diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 021a6ad2ab..1c98fca6af 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -222,7 +222,8 @@ Decl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) { if (InstantiatedAssertExpr.isInvalid()) return 0; - OwningExprResult Message = SemaRef.Clone(D->getMessage()); + OwningExprResult Message(SemaRef, D->getMessage()); + D->getMessage()->Retain(); Decl *StaticAssert = SemaRef.ActOnStaticAssertDeclaration(D->getLocation(), move(InstantiatedAssertExpr), diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 2e7ed1a632..1e97f5fcc4 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -57,53 +57,53 @@ Sema::OwningExprResult TemplateExprInstantiator::VisitExpr(Expr *E) { Sema::OwningExprResult TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr( UnresolvedFunctionNameExpr *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult @@ -706,7 +706,8 @@ TemplateExprInstantiator::VisitImplicitValueInitExpr( ImplicitValueInitExpr *E) { assert(!E->isTypeDependent() && !E->isValueDependent() && "ImplicitValueInitExprs are never dependent"); - return SemaRef.Clone(E); + E->Retain(); + return SemaRef.Owned(E); } Sema::OwningExprResult @@ -1110,7 +1111,7 @@ TemplateExprInstantiator::VisitCXXFunctionalCastExpr( Sema::OwningExprResult TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { - return SemaRef.Clone(E); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult @@ -1289,7 +1290,7 @@ TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr( //---------------------------------------------------------------------------- Sema::OwningExprResult TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) { - return SemaRef.Owned(E->Clone(SemaRef.Context)); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult @@ -1314,12 +1315,12 @@ TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) { Sema::OwningExprResult TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { - return SemaRef.Owned(E->Clone(SemaRef.Context)); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { - return SemaRef.Owned(E->Clone(SemaRef.Context)); + return SemaRef.Owned(E->Retain()); } Sema::OwningExprResult |