diff options
Diffstat (limited to 'lib/Parse/Parser.cpp')
-rw-r--r-- | lib/Parse/Parser.cpp | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 3cdaab6e88..70a336678c 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -15,12 +15,13 @@ #include "clang/Parse/ParseDiagnostic.h" #include "clang/Parse/DeclSpec.h" #include "clang/Parse/Scope.h" +#include "llvm/Support/raw_ostream.h" #include "ExtensionRAIIObject.h" #include "ParsePragma.h" using namespace clang; Parser::Parser(Preprocessor &pp, Action &actions) - : PP(pp), Actions(actions), Diags(PP.getDiagnostics()), + : CrashInfo(*this), PP(pp), Actions(actions), Diags(PP.getDiagnostics()), GreaterThanIsOperator(true) { Tok.setKind(tok::eof); CurScope = 0; @@ -38,30 +39,23 @@ Parser::Parser(Preprocessor &pp, Action &actions) PushTopClassStack(); } -/// Out-of-line virtual destructor to provide home for Action class. -ActionBase::~ActionBase() {} - -/// Out-of-line virtual destructor to provide home for Action class. -Action::~Action() {} - -// Defined out-of-line here because of dependecy on AttributeList -Action::DeclTy *Action::ActOnUsingDirective(Scope *CurScope, - SourceLocation UsingLoc, - SourceLocation NamespcLoc, - const CXXScopeSpec &SS, - SourceLocation IdentLoc, - IdentifierInfo *NamespcName, - AttributeList *AttrList) { - - // FIXME: Parser seems to assume that Action::ActOn* takes ownership over - // passed AttributeList, however other actions don't free it, is it - // temporary state or bug? - delete AttrList; - return 0; +/// If a crash happens while the parser is active, print out a line indicating +/// what the current token is. +void PrettyStackTraceParserEntry::print(llvm::raw_ostream &OS) const { + const Token &Tok = P.getCurToken(); + if (Tok.getLocation().isInvalid()) { + OS << "<eof> parser at end of file\n"; + return; + } + + const Preprocessor &PP = P.getPreprocessor(); + Tok.getLocation().print(OS, PP.getSourceManager()); + OS << ": current parser token '" << PP.getSpelling(Tok) << "'\n"; } + DiagnosticBuilder Parser::Diag(SourceLocation Loc, unsigned DiagID) { - return Diags.Report(FullSourceLoc(Loc,PP.getSourceManager()), DiagID); + return Diags.Report(FullSourceLoc(Loc, PP.getSourceManager()), DiagID); } DiagnosticBuilder Parser::Diag(const Token &Tok, unsigned DiagID) { |