diff options
| author | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-08-10 10:06:15 +0000 |
|---|---|---|
| committer | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-08-10 10:06:15 +0000 |
| commit | 27db23948c65e8737d763c3b1ed4b4427d264665 (patch) | |
| tree | 922a7a7d80d0059794a8741642bd4423b1741e22 /clang | |
| parent | 7fbe6cb42930a880afea561e0e882e0e390f5225 (diff) | |
| download | bcm5719-llvm-27db23948c65e8737d763c3b1ed4b4427d264665.tar.gz bcm5719-llvm-27db23948c65e8737d763c3b1ed4b4427d264665.zip | |
Added TypeLocs to VAArgExpr node.
llvm-svn: 110666
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/Expr.h | 9 | ||||
| -rw-r--r-- | clang/include/clang/AST/RecursiveASTVisitor.h | 5 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHReaderStmt.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriterStmt.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Sema/Sema.h | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 22 |
7 files changed, 37 insertions, 18 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 047d250d5b0..521353a31eb 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -2752,11 +2752,13 @@ public: /// VAArgExpr, used for the builtin function __builtin_va_arg. class VAArgExpr : public Expr { Stmt *Val; + TypeSourceInfo *TInfo; SourceLocation BuiltinLoc, RParenLoc; public: - VAArgExpr(SourceLocation BLoc, Expr* e, QualType t, SourceLocation RPLoc) + VAArgExpr(SourceLocation BLoc, Expr* e, TypeSourceInfo *TInfo, + SourceLocation RPLoc, QualType t) : Expr(VAArgExprClass, t, t->isDependentType(), false), - Val(e), + Val(e), TInfo(TInfo), BuiltinLoc(BLoc), RParenLoc(RPLoc) { } @@ -2767,6 +2769,9 @@ public: Expr *getSubExpr() { return cast<Expr>(Val); } void setSubExpr(Expr *E) { Val = E; } + TypeSourceInfo *getWrittenTypeInfo() const { return TInfo; } + void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo = TI; } + SourceLocation getBuiltinLoc() const { return BuiltinLoc; } void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index f599787a359..2c1a70a99df 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1680,7 +1680,10 @@ DEF_TRAVERSE_STMT(ShuffleVectorExpr, { }) DEF_TRAVERSE_STMT(StmtExpr, { }) DEF_TRAVERSE_STMT(UnresolvedLookupExpr, { }) DEF_TRAVERSE_STMT(UnresolvedMemberExpr, { }) -DEF_TRAVERSE_STMT(VAArgExpr, { }) +DEF_TRAVERSE_STMT(VAArgExpr, { + // The child-iterator will pick up the expression argument. + TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc())); + }) DEF_TRAVERSE_STMT(CXXConstructExpr, { }) DEF_TRAVERSE_STMT(CXXTemporaryObjectExpr, { diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp index 938ff9a48af..01c1640d9b3 100644 --- a/clang/lib/Frontend/PCHReaderStmt.cpp +++ b/clang/lib/Frontend/PCHReaderStmt.cpp @@ -710,6 +710,7 @@ void PCHStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { void PCHStmtReader::VisitVAArgExpr(VAArgExpr *E) { VisitExpr(E); E->setSubExpr(Reader.ReadSubExpr()); + E->setWrittenTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx)); E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); } diff --git a/clang/lib/Frontend/PCHWriterStmt.cpp b/clang/lib/Frontend/PCHWriterStmt.cpp index 2c4452c8884..52f0b79dcc7 100644 --- a/clang/lib/Frontend/PCHWriterStmt.cpp +++ b/clang/lib/Frontend/PCHWriterStmt.cpp @@ -695,6 +695,7 @@ void PCHStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { void PCHStmtWriter::VisitVAArgExpr(VAArgExpr *E) { VisitExpr(E); Writer.AddStmt(E->getSubExpr()); + Writer.AddTypeSourceInfo(E->getWrittenTypeInfo(), Record); Writer.AddSourceLocation(E->getBuiltinLoc(), Record); Writer.AddSourceLocation(E->getRParenLoc(), Record); Code = pch::EXPR_VA_ARG; diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 74d0f2afad6..6167668b861 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -2168,6 +2168,9 @@ public: virtual OwningExprResult ActOnVAArg(SourceLocation BuiltinLoc, ExprArg expr, TypeTy *type, SourceLocation RPLoc); + OwningExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, + ExprArg expr, TypeSourceInfo *TInfo, + SourceLocation RPLoc); // __null virtual OwningExprResult ActOnGNUNullExpr(SourceLocation TokenLoc); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index e5a50656874..d4b05389f49 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -7314,7 +7314,14 @@ Sema::OwningExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, Sema::OwningExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc, ExprArg expr, TypeTy *type, SourceLocation RPLoc) { - QualType T = GetTypeFromParser(type); + TypeSourceInfo *TInfo; + QualType T = GetTypeFromParser(type, &TInfo); + return BuildVAArgExpr(BuiltinLoc, move(expr), TInfo, RPLoc); +} + +Sema::OwningExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc, + ExprArg expr, TypeSourceInfo *TInfo, + SourceLocation RPLoc) { Expr *E = static_cast<Expr*>(expr.get()); Expr *OrigExpr = E; @@ -7348,9 +7355,8 @@ Sema::OwningExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc, // FIXME: Warn if a non-POD type is passed in. expr.release(); - return Owned(new (Context) VAArgExpr(BuiltinLoc, E, - T.getNonLValueExprType(Context), - RPLoc)); + QualType T = TInfo->getType().getNonLValueExprType(Context); + return Owned(new (Context) VAArgExpr(BuiltinLoc, E, TInfo, RPLoc, T)); } Sema::OwningExprResult Sema::ActOnGNUNullExpr(SourceLocation TokenLoc) { diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 65107ccfe79..a61768bcf43 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -1311,10 +1311,12 @@ public: /// /// By default, performs semantic analysis to build the new expression. /// Subclasses may override this routine to provide different behavior. - OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, - QualType T, SourceLocation RParenLoc) { - return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), - RParenLoc); + OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, + ExprArg SubExpr, TypeSourceInfo *TInfo, + SourceLocation RParenLoc) { + return getSema().BuildVAArgExpr(BuiltinLoc, + move(SubExpr), TInfo, + RParenLoc); } /// \brief Build a new expression list in parentheses. @@ -4780,14 +4782,12 @@ TreeTransform<Derived>::TransformImplicitValueInitExpr( template<typename Derived> Sema::OwningExprResult TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { - // FIXME: Do we want the type as written? - QualType T; - + TypeSourceInfo *TInfo; { // FIXME: Source location isn't quite accurate. TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); - T = getDerived().TransformType(E->getType()); - if (T.isNull()) + TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); + if (!TInfo) return SemaRef.ExprError(); } @@ -4796,12 +4796,12 @@ TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { return SemaRef.ExprError(); if (!getDerived().AlwaysRebuild() && - T == E->getType() && + TInfo == E->getWrittenTypeInfo() && SubExpr.get() == E->getSubExpr()) return SemaRef.Owned(E->Retain()); return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), - T, E->getRParenLoc()); + TInfo, E->getRParenLoc()); } template<typename Derived> |

