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 /clang/lib/Frontend | |
| parent | 5b59c1bf1f9c9ff7679de7766d3d5f39793d5dbe (diff) | |
| download | bcm5719-llvm-4259ebcdac724e2c9ec8933d8cbb94013997b785.tar.gz bcm5719-llvm-4259ebcdac724e2c9ec8933d8cbb94013997b785.zip | |
Fix broken PCH support for CXXDefaultArgExpr.
llvm-svn: 107541
Diffstat (limited to 'clang/lib/Frontend')
| -rw-r--r-- | clang/lib/Frontend/PCHReaderStmt.cpp | 19 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriterStmt.cpp | 13 | 
2 files changed, 20 insertions, 12 deletions
| 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;  } | 

