[cfe-commits] r71983 - in /cfe/trunk/lib/Sema: Sema.h SemaExprCXX.cpp

Anders Carlsson andersca at mac.com
Sun May 17 11:41:29 PDT 2009


Author: andersca
Date: Sun May 17 13:41:29 2009
New Revision: 71983

URL: http://llvm.org/viewvc/llvm-project?rev=71983&view=rev
Log:
Implement Sema::ActOnFinishFullExpr and create a CXXExprWithTemporaries node if necessary.

Modified:
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaExprCXX.cpp

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

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Sun May 17 13:41:29 2009
@@ -162,7 +162,11 @@
   /// in the top level function.  Clients should always use getSwitchStack() to
   /// handle the case when they are in a block.
   llvm::SmallVector<SwitchStmt*, 8> FunctionSwitchStack;
-  
+
+  /// ExprTemporaries - This is the stack of temporaries that are created by 
+  /// the current full expression.
+  llvm::SmallVector<CXXTempVarDecl*, 8> ExprTemporaries;
+
   /// CurFunctionNeedsScopeChecking - This is set to true when a function or
   /// ObjC method body contains a VLA or an ObjC try block, which introduce
   /// scopes that need to be checked for goto conditions.  If a function does
@@ -1583,6 +1587,8 @@
                                                TypeTy *Ty,
                                                SourceLocation RParen);
 
+  virtual OwningExprResult ActOnFinishFullExpr(ExprArg Expr);
+
   bool RequireCompleteDeclContext(const CXXScopeSpec &SS);
   
   DeclContext *computeDeclContext(const CXXScopeSpec &SS);

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

==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sun May 17 13:41:29 2009
@@ -164,8 +164,11 @@
       CallExpr::hasAnyTypeDependentArguments(Exprs, NumExprs)) {
     exprs.release();
     
-    // FIXME: Is this correct?
+    // FIXME: Is this correct (I don't think so). Instead, we should have an 
+    // CXXUnresolvedTemporaryObjectExpr node for this.
     CXXTempVarDecl *Temp = CXXTempVarDecl::Create(Context, CurContext, Ty);
+    ExprTemporaries.push_back(Temp);
+
     return Owned(new (Context) CXXTemporaryObjectExpr(Context, Temp, 0, Ty, 
                                                       TyBeginLoc,
                                                       Exprs, NumExprs,
@@ -190,6 +193,8 @@
   if (const RecordType *RT = Ty->getAsRecordType()) {
     CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl());
 
+    // FIXME: We should always create a CXXTemporaryObjectExpr here unless
+    // both the ctor and dtor are trivial.
     if (NumExprs > 1 || Record->hasUserDeclaredConstructor()) {
       CXXConstructorDecl *Constructor
         = PerformInitializationByConstructor(Ty, Exprs, NumExprs,
@@ -203,7 +208,8 @@
         return ExprError();
 
       CXXTempVarDecl *Temp = CXXTempVarDecl::Create(Context, CurContext, Ty);
-
+      ExprTemporaries.push_back(Temp);
+      
       exprs.release();
       return Owned(new (Context) CXXTemporaryObjectExpr(Context, Temp, 
                                                         Constructor, Ty,
@@ -1494,3 +1500,18 @@
   }
   return QualType();
 }
+
+Sema::OwningExprResult Sema::ActOnFinishFullExpr(ExprArg Arg) {
+  Expr *FullExpr = Arg.takeAs<Expr>();
+  assert(FullExpr && "Null full expr!");
+ 
+  if (!ExprTemporaries.empty()) {
+    // Create a cleanup expr.
+    FullExpr = 
+      new (Context) CXXExprWithTemporaries(FullExpr, &ExprTemporaries[0],
+                                           ExprTemporaries.size());
+    ExprTemporaries.clear();
+  }
+
+  return Owned(FullExpr);
+}





More information about the cfe-commits mailing list