diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-07-02 23:30:15 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-07-02 23:30:15 +0000 |
| commit | 4259ebcdac724e2c9ec8933d8cbb94013997b785 (patch) | |
| tree | 69206525e9e6e9f6560c929e8206a7758d15e014 | |
| parent | 5b59c1bf1f9c9ff7679de7766d3d5f39793d5dbe (diff) | |
| download | bcm5719-llvm-4259ebcdac724e2c9ec8933d8cbb94013997b785.tar.gz bcm5719-llvm-4259ebcdac724e2c9ec8933d8cbb94013997b785.zip | |
Fix broken PCH support for CXXDefaultArgExpr.
llvm-svn: 107541
| -rw-r--r-- | clang/include/clang/AST/ExprCXX.h | 13 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHReaderStmt.cpp | 19 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriterStmt.cpp | 13 |
3 files changed, 23 insertions, 22 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 4514f96f083..6da32bacd30 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -465,7 +465,6 @@ class CXXDefaultArgExpr : public Expr { /// \brief The location where the default argument expression was used. SourceLocation Loc; -protected: CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param) : Expr(SC, param->hasUnparsedDefaultArg() @@ -504,9 +503,6 @@ public: // Retrieve the parameter that the argument was created from. const ParmVarDecl *getParam() const { return Param.getPointer(); } ParmVarDecl *getParam() { return Param.getPointer(); } - - /// isExprStored - Return true if this expression owns the expression. - bool isExprStored() const { return Param.getInt(); } // Retrieve the actual argument to the function call. const Expr *getExpr() const { @@ -519,16 +515,10 @@ public: return *reinterpret_cast<Expr **> (this + 1); return getParam()->getDefaultArg(); } - - void setExpr(Expr *E) { - Param.setInt(true); - Param.setPointer((ParmVarDecl*)E); - } /// \brief Retrieve the location where this default argument was actually /// used. SourceLocation getUsedLocation() const { return Loc; } - void setUsedLocation(SourceLocation L) { Loc = L; } virtual SourceRange getSourceRange() const { // Default argument expressions have no representation in the @@ -544,6 +534,9 @@ public: // Iterators virtual child_iterator child_begin(); virtual child_iterator child_end(); + + friend class PCHStmtReader; + friend class PCHStmtWriter; }; /// CXXTemporary - Represents a C++ temporary. diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp index b9751e84960..c2dea3adc24 100644 --- a/clang/lib/Frontend/PCHReaderStmt.cpp +++ b/clang/lib/Frontend/PCHReaderStmt.cpp @@ -982,10 +982,11 @@ void PCHStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { void PCHStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { VisitExpr(E); - E->setUsedLocation(SourceLocation::getFromRawEncoding(Record[Idx++])); - bool HasStoredExpr = Record[Idx++]; - if (!HasStoredExpr) return; - E->setExpr(Reader.ReadSubExpr()); + + assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?"); + ++Idx; // HasOtherExprStored and SubExpr was handled during creation. + E->Param.setPointer(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); + E->Loc = Reader.ReadSourceLocation(Record, Idx); } void PCHStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { @@ -1552,9 +1553,15 @@ Stmt *PCHReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) { case pch::EXPR_CXX_THROW: S = new (Context) CXXThrowExpr(Empty); break; - case pch::EXPR_CXX_DEFAULT_ARG: - S = new (Context) CXXDefaultArgExpr(Empty); + case pch::EXPR_CXX_DEFAULT_ARG: { + bool HasOtherExprStored = Record[PCHStmtReader::NumExprFields]; + if (HasOtherExprStored) { + Expr *SubExpr = ReadSubExpr(); + S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr); + } else + S = new (Context) CXXDefaultArgExpr(Empty); break; + } case pch::EXPR_CXX_BIND_TEMPORARY: S = new (Context) CXXBindTemporaryExpr(Empty); break; diff --git a/clang/lib/Frontend/PCHWriterStmt.cpp b/clang/lib/Frontend/PCHWriterStmt.cpp index 11b1afd3730..12fcde845ec 100644 --- a/clang/lib/Frontend/PCHWriterStmt.cpp +++ b/clang/lib/Frontend/PCHWriterStmt.cpp @@ -983,13 +983,14 @@ void PCHStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) { void PCHStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { VisitExpr(E); - Writer.AddSourceLocation(E->getUsedLocation(), Record); - if (E->isExprStored()) { - Record.push_back(1); + + bool HasOtherExprStored = E->Param.getInt(); + // Store these first, the reader reads them before creation. + Record.push_back(HasOtherExprStored); + if (HasOtherExprStored) Writer.AddStmt(E->getExpr()); - } else { - Record.push_back(0); - } + Writer.AddDeclRef(E->getParam(), Record); + Writer.AddSourceLocation(E->getUsedLocation(), Record); Code = pch::EXPR_CXX_DEFAULT_ARG; } |

