]> granicus.if.org Git - clang/commitdiff
Added TypeLocs to VAArgExpr node.
authorAbramo Bagnara <abramo.bagnara@gmail.com>
Tue, 10 Aug 2010 10:06:15 +0000 (10:06 +0000)
committerAbramo Bagnara <abramo.bagnara@gmail.com>
Tue, 10 Aug 2010 10:06:15 +0000 (10:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110666 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
include/clang/AST/RecursiveASTVisitor.h
lib/Frontend/PCHReaderStmt.cpp
lib/Frontend/PCHWriterStmt.cpp
lib/Sema/Sema.h
lib/Sema/SemaExpr.cpp
lib/Sema/TreeTransform.h

index 047d250d5b0d7e5aaf5221a106e82fa8d0160bdd..521353a31ebde5bb00801a9bdfffb4728d40b641 100644 (file)
@@ -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; }
 
index f599787a359e7b070cda83822f43cfab7c323af7..2c1a70a99df413f2688f64df1688a923be04a47a 100644 (file)
@@ -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, {
index 938ff9a48afcd24b4a00ce46639fc2c964eb8803..01c1640d9b3398012281502711c6d351c27ff459 100644 (file)
@@ -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++]));
 }
index 2c4452c8884a1aad744a04973873533e73e21248..52f0b79dcc7196d8170931e10e8ac4c2c95d432c 100644 (file)
@@ -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;
index 74d0f2afad672a509bef0eea338cb142b06aa950..6167668b861fa7b62ca2deaa4f9320ea98ebf888 100644 (file)
@@ -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);
index e5a50656874fcb89323d2e7248c24157c545459a..d4b05389f4931656cd6c5ee0f9df4e74a66581fd 100644 (file)
@@ -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) {
index 65107ccfe79340743249c62d35ea784593dad834..a61768bcf432e621fe8287fb87ed3d7fd225cf65 100644 (file)
@@ -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>