blob: f47284f3d06045439e1f2190794eefa8f2069c04 [file] [log] [blame]
//===--- FullExpr.cpp - C++ full expression class ---------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the FullExpr interface, to be used for type safe handling
// of full expressions.
//
// Full expressions are described in C++ [intro.execution]p12.
//
//===----------------------------------------------------------------------===//
#include "clang/AST/ASTContext.h"
#include "clang/AST/FullExpr.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "llvm/Support/AlignOf.h"
using namespace clang;
FullExpr FullExpr::Create(ASTContext &Context, Expr *SubExpr,
CXXTemporary **Temporaries, unsigned NumTemporaries) {
FullExpr E;
if (!NumTemporaries) {
E.SubExpr = SubExpr;
return E;
}
unsigned Size = sizeof(FullExpr)
+ sizeof(CXXTemporary *) * NumTemporaries;
unsigned Align = llvm::AlignOf<ExprAndTemporaries>::Alignment;
ExprAndTemporaries *ET =
static_cast<ExprAndTemporaries *>(Context.Allocate(Size, Align));
ET->SubExpr = SubExpr;
std::copy(Temporaries, Temporaries + NumTemporaries, ET->temps_begin());
return E;
}
void FullExpr::Destroy(ASTContext &Context) {
if (Expr *E = SubExpr.dyn_cast<Expr *>()) {
E->Destroy(Context);
return;
}
ExprAndTemporaries *ET = SubExpr.get<ExprAndTemporaries *>();
for (ExprAndTemporaries::temps_iterator i = ET->temps_begin(),
e = ET->temps_end(); i != e; ++i)
(*i)->Destroy(Context);
Context.Deallocate(ET);
}