/// 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
TypeTy *Ty,
SourceLocation RParen);
+ virtual OwningExprResult ActOnFinishFullExpr(ExprArg Expr);
+
bool RequireCompleteDeclContext(const CXXScopeSpec &SS);
DeclContext *computeDeclContext(const CXXScopeSpec &SS);
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,
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,
return ExprError();
CXXTempVarDecl *Temp = CXXTempVarDecl::Create(Context, CurContext, Ty);
-
+ ExprTemporaries.push_back(Temp);
+
exprs.release();
return Owned(new (Context) CXXTemporaryObjectExpr(Context, Temp,
Constructor, Ty,
}
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);
+}