[cfe-commits] r72944 - in /cfe/trunk: include/clang/AST/ExprCXX.h lib/AST/ExprCXX.cpp lib/Sema/Sema.h lib/Sema/SemaExprCXX.cpp

Anders Carlsson andersca at mac.com
Fri Jun 5 08:38:08 PDT 2009


Author: andersca
Date: Fri Jun  5 10:38:08 2009
New Revision: 72944

URL: http://llvm.org/viewvc/llvm-project?rev=72944&view=rev
Log:
Improvements to CXXExprWithTemporaries in preparation for fixing a bug with default arguments that have temporaries.

Modified:
    cfe/trunk/include/clang/AST/ExprCXX.h
    cfe/trunk/lib/AST/ExprCXX.cpp
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaExprCXX.cpp

Modified: cfe/trunk/include/clang/AST/ExprCXX.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=72944&r1=72943&r2=72944&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/ExprCXX.h (original)
+++ cfe/trunk/include/clang/AST/ExprCXX.h Fri Jun  5 10:38:08 2009
@@ -1023,14 +1023,17 @@
   CXXTemporary **Temps;
   unsigned NumTemps;
 
-  CXXExprWithTemporaries(Expr *subexpr, CXXTemporary **temps, 
-                         unsigned numtemps);
+  bool DestroyTemps;
+  
+  CXXExprWithTemporaries(Expr *SubExpr, CXXTemporary **Temps, 
+                         unsigned NumTemps, bool DestroyTemps);
   ~CXXExprWithTemporaries();
   
 public:
   static CXXExprWithTemporaries *Create(ASTContext &C, Expr *SubExpr,
                                         CXXTemporary **Temps, 
-                                        unsigned NumTemps);
+                                        unsigned NumTemps,
+                                        bool DestroyTems);
   void Destroy(ASTContext &C);
   
   unsigned getNumTemporaries() const { return NumTemps; }

Modified: cfe/trunk/lib/AST/ExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=72944&r1=72943&r2=72944&view=diff

==============================================================================
--- cfe/trunk/lib/AST/ExprCXX.cpp (original)
+++ cfe/trunk/lib/AST/ExprCXX.cpp Fri Jun  5 10:38:08 2009
@@ -305,10 +305,11 @@
 
 CXXExprWithTemporaries::CXXExprWithTemporaries(Expr *subexpr, 
                                                CXXTemporary **temps, 
-                                               unsigned numtemps)
+                                               unsigned numtemps,
+                                               bool destroytemps)
 : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
        subexpr->isTypeDependent(), subexpr->isValueDependent()), 
-  SubExpr(subexpr), Temps(0), NumTemps(numtemps) {
+  SubExpr(subexpr), Temps(0), NumTemps(numtemps), DestroyTemps(destroytemps) {
   if (NumTemps > 0) {
     Temps = new CXXTemporary*[NumTemps];
     for (unsigned i = 0; i < NumTemps; ++i)
@@ -319,8 +320,10 @@
 CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C, 
                                                        Expr *SubExpr,
                                                        CXXTemporary **Temps, 
-                                                       unsigned NumTemps) {
-  return new (C) CXXExprWithTemporaries(SubExpr, Temps, NumTemps);
+                                                       unsigned NumTemps,
+                                                       bool DestroyTemps) {
+  return new (C) CXXExprWithTemporaries(SubExpr, Temps, NumTemps, 
+                                        DestroyTemps);
 }
 
 void CXXExprWithTemporaries::Destroy(ASTContext &C) {

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=72944&r1=72943&r2=72944&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Fri Jun  5 10:38:08 2009
@@ -1630,6 +1630,12 @@
                                                TypeTy *Ty,
                                                SourceLocation RParen);
 
+  /// MaybeCreateCXXExprWithTemporaries - If the list of temporaries is 
+  /// non-empty, will create a new CXXExprWithTemporaries expression.
+  /// Otherwise, just returs the passed in expression.
+  Expr *MaybeCreateCXXExprWithTemporaries(Expr *SubExpr, 
+                                          bool DestroyTemps = true);
+  
   virtual OwningExprResult ActOnFinishFullExpr(ExprArg Expr);
 
   bool RequireCompleteDeclContext(const CXXScopeSpec &SS);

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=72944&r1=72943&r2=72944&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Fri Jun  5 10:38:08 2009
@@ -1588,16 +1588,26 @@
   return E;
 }
 
+Expr *Sema::MaybeCreateCXXExprWithTemporaries(Expr *SubExpr, 
+                                              bool DestroyTemps) {
+  assert(SubExpr && "sub expression can't be null!");
+  
+  if (ExprTemporaries.empty())
+    return SubExpr;
+  
+  Expr *E = CXXExprWithTemporaries::Create(Context, SubExpr,
+                                           &ExprTemporaries[0], 
+                                           ExprTemporaries.size(),
+                                           DestroyTemps);
+  ExprTemporaries.clear();
+  
+  return E;
+}
+
 Sema::OwningExprResult Sema::ActOnFinishFullExpr(ExprArg Arg) {
   Expr *FullExpr = Arg.takeAs<Expr>();
-
-  if (FullExpr && !ExprTemporaries.empty()) {
-    // Create a cleanup expr.
-    FullExpr = CXXExprWithTemporaries::Create(Context, FullExpr,
-                                              &ExprTemporaries[0], 
-                                              ExprTemporaries.size());
-    ExprTemporaries.clear();
-  }
+  if (FullExpr)
+    FullExpr = MaybeCreateCXXExprWithTemporaries(FullExpr);
 
   return Owned(FullExpr);
 }





More information about the cfe-commits mailing list