diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-08-08 01:41:12 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-08-08 01:41:12 +0000 |
| commit | 2c742024ff2c41eb01b85bb574f5b0855a24924a (patch) | |
| tree | 480b8751bcdf556d23c3c55de0601c4c693c3fb3 /clang/lib/Sema | |
| parent | b94284b5e2aed610005e6d5698480837e0512319 (diff) | |
| download | bcm5719-llvm-2c742024ff2c41eb01b85bb574f5b0855a24924a.tar.gz bcm5719-llvm-2c742024ff2c41eb01b85bb574f5b0855a24924a.zip | |
Introduce reference counting for statements and expressions, using it
to allow sharing of nodes. Simplifies some aspects of template
instantiation, and fixes both PR3444 and <rdar://problem/6757457>.
llvm-svn: 78450
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/Sema.h | 8 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 31 |
3 files changed, 18 insertions, 24 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 6094e6dae03..295607b7399 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/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/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 021a6ad2ab4..1c98fca6af4 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/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/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index 2e7ed1a6326..1e97f5fcc46 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/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 |

