git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67923 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-03-28 06:33:19 +00:00
Родитель fe95deaf66
Коммит 7e24e82a70
8 изменённых файлов: 40 добавлений и 41 удалений

Просмотреть файл

@ -235,14 +235,14 @@ public:
virtual void Destroy(ASTContext& Ctx);
/// hasSolitaryDecl - This method returns true if this DeclStmt refers
/// isSingleDecl - This method returns true if this DeclStmt refers
/// to a single Decl.
bool hasSolitaryDecl() const {
bool isSingleDecl() const {
return DG.isSingleDecl();
}
const Decl* getSolitaryDecl() const { return DG.getSingleDecl(); }
Decl *getSolitaryDecl() { return DG.getSingleDecl(); }
const Decl *getSingleDecl() const { return DG.getSingleDecl(); }
Decl *getSingleDecl() { return DG.getSingleDecl(); }
SourceLocation getStartLoc() const { return StartLoc; }
SourceLocation getEndLoc() const { return EndLoc; }

Просмотреть файл

@ -358,41 +358,40 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt = false) {
case Stmt::DeclStmtClass: {
DeclStmt *DS = cast<DeclStmt>(Terminator);
if (DS->hasSolitaryDecl()) {
if (DS->isSingleDecl()) {
Block->appendStmt(Terminator);
return WalkAST_VisitDeclSubExpr(DS->getSolitaryDecl());
return WalkAST_VisitDeclSubExpr(DS->getSingleDecl());
}
else {
typedef llvm::SmallVector<Decl*,10> BufTy;
BufTy Buf;
CFGBlock* B = 0;
typedef llvm::SmallVector<Decl*,10> BufTy;
BufTy Buf;
CFGBlock* B = 0;
// FIXME: Add a reverse iterator for DeclStmt to avoid this
// extra copy.
for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE=DS->decl_end();
DI != DE; ++DI)
Buf.push_back(*DI);
// FIXME: Add a reverse iterator for DeclStmt to avoid this
// extra copy.
for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE=DS->decl_end();
DI != DE; ++DI)
Buf.push_back(*DI);
for (BufTy::reverse_iterator I=Buf.rbegin(), E=Buf.rend(); I!=E; ++I) {
// Get the alignment of the new DeclStmt, padding out to >=8 bytes.
unsigned A = llvm::AlignOf<DeclStmt>::Alignment < 8
? 8 : llvm::AlignOf<DeclStmt>::Alignment;
for (BufTy::reverse_iterator I=Buf.rbegin(), E=Buf.rend(); I!=E; ++I) {
// Get the alignment of the new DeclStmt, padding out to >=8 bytes.
unsigned A = llvm::AlignOf<DeclStmt>::Alignment < 8
? 8 : llvm::AlignOf<DeclStmt>::Alignment;
// Allocate the DeclStmt using the BumpPtrAllocator. It will
// get automatically freed with the CFG.
DeclGroupRef DG(*I);
Decl* D = *I;
void* Mem = cfg->getAllocator().Allocate(sizeof(DeclStmt), A);
DeclStmt* DS = new (Mem) DeclStmt(DG, D->getLocation(),
GetEndLoc(D));
// Append the fake DeclStmt to block.
Block->appendStmt(DS);
B = WalkAST_VisitDeclSubExpr(D);
}
return B;
// Allocate the DeclStmt using the BumpPtrAllocator. It will
// get automatically freed with the CFG.
DeclGroupRef DG(*I);
Decl* D = *I;
void* Mem = cfg->getAllocator().Allocate(sizeof(DeclStmt), A);
DeclStmt* DS = new (Mem) DeclStmt(DG, D->getLocation(),
GetEndLoc(D));
// Append the fake DeclStmt to block.
Block->appendStmt(DS);
B = WalkAST_VisitDeclSubExpr(D);
}
return B;
}
case Stmt::AddrLabelExprClass: {

Просмотреть файл

@ -1534,7 +1534,7 @@ void GRExprEngine::VisitObjCForCollectionStmt(ObjCForCollectionStmt* S,
SVal ElementV;
if (DeclStmt* DS = dyn_cast<DeclStmt>(elem)) {
VarDecl* ElemD = cast<VarDecl>(DS->getSolitaryDecl());
VarDecl* ElemD = cast<VarDecl>(DS->getSingleDecl());
assert (ElemD->getInit() == 0);
ElementV = getStateManager().GetLValue(GetState(Pred), ElemD);
VisitObjCForCollectionStmtAux(S, Pred, Dst, ElementV);

Просмотреть файл

@ -194,7 +194,7 @@ TransferFuncs::BlockStmt_VisitObjCForCollectionStmt(ObjCForCollectionStmt* S) {
VarDecl* VD = 0;
if (DeclStmt* DS = dyn_cast<DeclStmt>(Element))
VD = cast<VarDecl>(DS->getSolitaryDecl());
VD = cast<VarDecl>(DS->getSingleDecl());
else {
Expr* ElemExpr = cast<Expr>(Element)->IgnoreParens();
if ((DR = dyn_cast<DeclRefExpr>(ElemExpr)))

Просмотреть файл

@ -193,7 +193,7 @@ TransferFuncs::BlockStmt_VisitObjCForCollectionStmt(ObjCForCollectionStmt* S) {
VarDecl* VD = 0;
if (DeclStmt* DS = dyn_cast<DeclStmt>(Element))
VD = cast<VarDecl>(DS->getSolitaryDecl());
VD = cast<VarDecl>(DS->getSingleDecl());
else {
Expr* ElemExpr = cast<Expr>(Element)->IgnoreParens();

Просмотреть файл

@ -436,7 +436,7 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
if (const DeclStmt *SD = dyn_cast<DeclStmt>(S.getElement())) {
EmitStmt(SD);
assert(HaveInsertPoint() && "DeclStmt destroyed insert point!");
const Decl* D = SD->getSolitaryDecl();
const Decl* D = SD->getSingleDecl();
ElementTy = cast<ValueDecl>(D)->getType();
DeclAddress = LocalDeclMap[D];
} else {

Просмотреть файл

@ -627,11 +627,11 @@ Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc,
if (First) {
QualType FirstType;
if (DeclStmt *DS = dyn_cast<DeclStmt>(First)) {
if (!DS->hasSolitaryDecl())
if (!DS->isSingleDecl())
return StmtError(Diag((*DS->decl_begin())->getLocation(),
diag::err_toomany_element_decls));
Decl *D = DS->getSolitaryDecl();
Decl *D = DS->getSingleDecl();
FirstType = cast<ValueDecl>(D)->getType();
// C99 6.8.5p3: The declaration part of a 'for' statement shall only
// declare identifiers for objects having storage class 'auto' or

Просмотреть файл

@ -1306,7 +1306,7 @@ Stmt *RewriteObjC::RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S,
buf = "\n{\n\t";
if (DeclStmt *DS = dyn_cast<DeclStmt>(S->getElement())) {
// type elem;
NamedDecl* D = cast<NamedDecl>(DS->getSolitaryDecl());
NamedDecl* D = cast<NamedDecl>(DS->getSingleDecl());
QualType ElementType = cast<ValueDecl>(D)->getType();
elementTypeAsString = ElementType.getAsString();
buf += elementTypeAsString;